作为我的this问题显示我想在用户选择文本时弹出显示。然后将显示有关该单词的弹出式详细信息。
但我没有得到任何满意的答案,所以我改变了我的逻辑。
现在我想在我的UIMenuController中显示一个项目Pop-Up
,当用户点击该选项时,将显示弹出窗口。
我使用此代码实现了这一目标,
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Pop-Up" action:@selector(displayPopUp:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
所以我的选项是显示,当我点击该选项而不是弹出显示。但是其他一些选项也显示我不想要,就像这样
我用Google搜索并获取此代码
- (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中的这个额外项目。
答案 0 :(得分:1)
将canPerformAction方法发送给Responder链中的每个人。因此,如果您上面提到的代码在ViewController中,但UITextView是第一个响应者,它将无法工作。我发现最简单的事情是子类UITextView并将canPerformAction代码放在那里。我禁用所有默认的menuItems并创建一个我自己的菜单。
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
}
}
}