如何从UIMenuController中删除Copy,Select All,define menuItem

时间:2013-07-02 12:52:06

标签: iphone ios uimenucontroller

作为我的this问题显示我想在用户选择文本时弹出显示。然后将显示有关该单词的弹出式详细信息。

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

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

我使用此代码实现了这一目标,

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Pop-Up" action:@selector(displayPopUp:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];

所以我的选项是显示,当我点击该选项而不是弹出显示。但是其他一些选项也显示我不想要,就像这样

enter image description here

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

1 个答案:

答案 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
    }

}

}