如何删除复制,全选,从UIMenuController中定义menuItem

正如我的这个问题显示我想显示popup时,用户select文本。 并popup有关该单词的详细信息将被显示。

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

现在,我想在我的UIMenuController中显示一个项目,如Pop-Up菜单,当用户单击该选项而不是显示popup窗口时。

我用这个代码实现了这个,

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

所以我的select显示,当我点击该选项比popup式显示。但其他一些选项也显示,我不想这样,这样

在这里输入图像说明

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

canPerformAction方法发送给响应者链中的每个人。 所以,如果你上面提到的代码是在ViewController中,但是UITextView是第一个响应者,它将不起作用。 我发现最简单的事情是子类UITextView,并把canPerformAction代码放在​​那里。 我禁用所有的默认菜单项,并创build我自己的菜单。

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

}