- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一个支持在 UITextView 中编辑属性文本的应用程序。为了向用户提供格式化输入的工具,我使用 inputAccessoryView 来增加键盘的选项,例如项目符号列表、编号列表、缩进、取消缩进、字体控制(粗体、下划线、增加字体大小、减小字体大小)等. 这对于 inputAccessoryView 来说太多了,所以我希望使用 UIMenuController 来提供一种机制,为用户提供更多空间来表达他们的意图。
因此,我有一个带有“listAccessory”按钮的 inputAccessoryView。按下时,我想显示一个带有四个选项(项目符号、数字、增加缩进、减少缩进)的 UIMenuController。但是当我显示这个菜单时,它还包括“选择”、“全选”和“粘贴”。
我没有在我的 View 中定义任何这些方法(select:、selectAll: 或 paste: 在 UIResponderStandardEditActions 非正式协议(protocol)中定义)。我已经定义了 canPerformAction:withSender: 并且只为我的选择器响应"is"。
- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
{
DDLogInfo(@"canPerformAction: %@", NSStringFromSelector(selector));
if (selector == @selector(formatAsBulletList:)) return YES;
if (selector == @selector(formatAsNumberedList:)) return YES;
if (selector == @selector(formatIncreaseIndent:)) return YES;
if (selector == @selector(formatDecreaseIndent:)) return YES;
return NO; // return [super canPerformAction:selector withSender:sender];
}
当我记录在此代码中调用的选择器时,我没有看到任何对“select:”、“selectAll:”或“paste:”的请求,因此我相信 UIMenuController 代码正在测试这些方法直接调用 canPerformSelector() 针对类。
因为我没有在我的 viewController(派生自 UITableViewController)中实现这些功能,我只能相信 UIMenuController 正在查找响应者链并看到最初启动键盘的响应者是一个 UITextView,它确实支持选择、全选和粘贴。
所以我有几个问题:
1) 我对情况的理解正确吗?
2) 如何强制不显示这些菜单项?我能否在不关闭键盘的情况下以某种方式暂时中断响应链?
最佳答案
很酷的问题。问题出在您的理解上。当您尝试调用菜单时,UITextView
是第一响应者,因此它会使用 Select
和 Select All< 填充菜单
Action
一个解决方案是子类化 UITextView
并添加一个额外的属性,允许您短暂地阻止项目。
我试过了,它在 UITextField
上工作,因为它是我必须提交的,但没有理由相信它不会在 UITextView
上工作
轻松地对您的 View 进行子类化。
@interface CharlieDevTextView : UITextView
@property BOOL blockActionMenu;
@end
和
@implementation CharlieDevTextView
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (self.blockActionMenu) {
return NO;
}
return [super canPerformAction:action withSender:sender];
}
@end
然后当你构造你的菜单时(假设你有一个 IBOutlet 到 textview)
-(void)yellowMellow:(id)sender {
}
-(void)createMenuForButton:(UIButton *)sender
{
UIMenuItem *newInstanceItem = [[UIMenuItem alloc] initWithTitle:@"Woot" action:@selector(yellowMellow:)];
[UIMenuController sharedMenuController].menuItems = @[newInstanceItem];
CGPoint apoint = sender.center;
self.charlieTextView.blockActionMenu = YES;
[[UIMenuController sharedMenuController] setTargetRect:CGRectMake(apoint.x,apoint.y, 0, 0) inView:sender.superview];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
self.charlieTextView.blockActionMenu = NO;
}
或者听取 UIMenuControllerWillShowMenuNotification
和 UIMenuControllerDidHideMenuNotification
以打开和关闭阻止。
并且可能为了让它稍微不那么难看,创建一个委托(delegate)而不是一个属性。您的 View Controller 将成为委托(delegate)并判断它是要显示菜单还是注意到菜单已被取消。
基本相同的效果,不同的模式。
@protocol CharlieTextViewMenuDelegate <NSObject>
-(BOOL)shouldBlockMenu;
@end
@interface CharlieTextView : UITextView
@property (nonatomic,weak) id< CharlieTextViewMenuDelegate> menuDelegate;
@end
@implementation CharlieDevTextView
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if ([self.menuDelegate shouldBlockMenu]) {
return NO;
}
return [super canPerformAction:action withSender:sender];
}
@end
关于ios - 在显示附加到 inputAccessoryView 的 UIMenuController 中隐藏 'select' 、 'selectAll' 、 'paste' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20001798/
为什么 d3.selectAll('rect')... 不能像下面脚本中的 mouseover 函数那样工作,但是 svg.selectAll('rect').. . 是吗? svg 是 r2d3 的
谁知道有什么区别? 我的理解是两者都会返回相同的选择。 但是,当我进行追加时,如果我使用 selectAll("p") 它不起作用。 例如,这个有效: var foo = d3.select("bod
我有以下 html 页面: var check = 0; function doNow() { void(d=document); void(el=d.getElementsBy
请参阅下面的 JavaScript: function Test() { alert('got here'); } function SelectAll() { var fr
我使用了 selectAll() 函数,但它似乎什么也没做。有没有办法让文本突出显示,这样他们就不必退格然后重新输入? void GetQuantity() { AlertDialog.Bui
我一直在玩示例 "Using D3.js to present XML as HTML Table" , 尝试学习 D3.js API。我想我已经掌握了窍门,但我无法真正理解 .selectAll()
我已经初始化了一个具有 id example 的数据表,如下所示 - var table = $("#example").DataTable({ "aaSorting": [[4, "asc"
根据一些问题的答案,我已将“本地化 native 开发区域”更改为“中国”,但是当我调试应用程序时,我在标题中列出的按钮文本仍然是英文任何其他我应该做的事情怎样解决这个问题? 最佳答案 答案是: 更改
我的 asp.net mvc Web 应用程序中有以下 Razor View :- foreach (var item in Model) { @Html.Action
是否可以使用 selectAll 在 D3 中选择多个选择器? 我想要像 svg.selectAll("class1", "circle", "id2") 这样的东西来选择所有 circle 元素,c
我正在使用 Vaadin,并且在表单中有一组文本字段。文本字段具有 focusListeners,它会触发一个方法,该方法将文本字段中的所有文本(如果有)聚焦。 我的问题是,自动选择实际上有一半的时间
根据 中的列选择显示数据表中的列. 在该列选择中,当我单独选中所有复选框时,应选中 selectAll。 当用户单独选择数据表所有复选框列切换器时,如何检查 SelectAll? 数据表中的切换器代
我有这段代码: var series, seriesChildren; selection.each(function (data) { series = d3.select(this).se
我有一个选择 g 标签的变量(我们称她为 all_g)。我想选择这个 g 的一些内容。 所以这是我的 g 标签中的内容: The G-tag 我想覆盖所有其他 afterText 内容,例如这个包含“
我正在尝试理解 source code for d3 selectAll我不明白下面我的评论之后的那一行。 我可以看到选择器字符串上有一个闭包,并且在调用 d3_selectAll 时 this 设置
我有很多不同的 JFormattedTextFields 以及操作和按键监听器。每个字段都有一个按键监听器,因此当我按 Enter 键时,我将关注下一个 JFormattedTextField。问题是
我正在尝试实现一个必须遵守以下规则的 JTable: 只能编辑第 3 列的单元格。 双击X行的任意单元格,X行第3列开始编辑。 每当开始编辑一个单元格时,它里面的文本就会被选中。 我有一个扩展 JTa
最初我有一个来自 csv 的平面哈希结构,它具有以下字段: zoneId,op,metricName,value 然后我把它嵌套在 d3.nest() .key(function(d){retur
我正在学习 D3,以及如何使用 D3 的数据绑定(bind)机制将元素嵌套或附加到页面。 我修改了在 http://www.recursion.org/d3-for-mere-mortals/ 上找到
我正在研究以下径向图: //Fade out all players except the first player g.selectAll(".teamArc")
我是一名优秀的程序员,十分优秀!