作为我的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中的这个额外项。
最佳答案
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
}
}
}