3

作为我的这个问题显示,我想在用户选择文本时显示弹出窗口。并在该弹出窗口中显示有关该单词的详细信息。

但我没有得到任何满意的答案,所以我改变了我的逻辑。

现在我想Pop-Up在我的 UIMenuController 中显示一个项目,当用户单击该选项时,将显示弹出窗口。

我已经使用这段代码实现了这一点,

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 中的这个额外项。

4

1 回答 1

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
    }

}

}

于 2017-03-12T11:19:46.497 回答