作为我的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
    }

}

}

07-27 19:01