如何从 UIMenuController 中删除 Copy、Select All、Define menuItem
Posted
技术标签:
【中文标题】如何从 UIMenuController 中删除 Copy、Select All、Define menuItem【英文标题】:How to remove Copy,Select All,Define menuItem from UIMenuController 【发布时间】:2013-07-02 12:52:06 【问题描述】:作为我的this 问题显示,我想在用户选择文本时显示弹出窗口。并在该弹出窗口中显示有关该单词的详细信息。
但我没有得到任何满意的答案,所以我改变了我的逻辑。
现在我想在我的 UIMenuController 中显示一个类似 Pop-Up
的项目,当用户单击该选项时,将显示弹出窗口。
我已经使用此代码实现了这一点,
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Pop-Up" action:@selector(displayPopUp:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
所以我的选项正在显示,当我单击该选项而不是弹出显示时。但是其他一些选项也显示了我不想要的,就像这样
我已经用谷歌搜索并得到了这个代码
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
[UIMenuController sharedMenuController].menuVisible = NO; //do not display the menu
if (action == @selector(copy:))
return NO;
else if (action == @selector(selectAll:))
return NO;
[self resignFirstResponder]; //do not allow the user to selected anything
return NO;
return [super canPerformAction:action withSender:sender];
但它并没有删除 UIMenuController 中的这个额外项。
【问题讨论】:
编辑上一个问题以增加清晰度,而不是创建一个稍微修改的新问题。 @Amar 我不同意你的看法。 bcoz 我看到他的整个问题都随着小的逻辑变化而改变,所以没关系。 【参考方案1】:canPerformAction 方法被发送给 Responder 链中的每个人。因此,如果您上面提到的代码在 ViewController 中但 UITextView 是第一个 Responder,它将无法正常工作。我发现最简单的做法是继承 UITextView 并将 canPerformAction 代码放在那里。我禁用所有默认菜单项并创建自己的菜单。
class rtfView: UITextView
override func canPerformAction(_ action: Selector, withSender sender: Any!) -> Bool
if (action == #selector(textItem(_:))) || (action == #selector(h1Item(_:))) || (action == #selector(h2Item(_:))) || (action == #selector(h3Item(_:)))
return true
else
return false
【讨论】:
以上是关于如何从 UIMenuController 中删除 Copy、Select All、Define menuItem的主要内容,如果未能解决你的问题,请参考以下文章
如何从 iOS 的 UIMenuController 中删除默认的 UIMenuItem?
如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?
如何从 UIMenuController 中删除 Copy、Select All、Define menuItem