从UIMenuController中删除复制,查找和共享

我试图覆盖默认的UIMenuController以便当用户在其文本视图中选择文本时,只显示我的自定义项“定义…”。 到目前为止,我在网上找到的方法并没有太多运气。

更具体地说,我已经将UIViewController子类化,并使用canPerformAction()来排除除了我的define方法之外的所有操作。

 override func becomeFirstResponder() -> Bool { return true } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { let canPerform: Bool if action == #selector(defineWord){ canPerform = true } else { canPerform = false } print("action = \(action), canPerform = \(canPerform)") return canPerform } 

在视图控制器的viewDidLoad() ,我包括以下内容:

 let shared = UIMenuController.shared let menuItemDefine = UIMenuItem(title: "Define...", action: #selector(self.defineWord)) shared.menuItems = [menuItemDefine] 

每当我在视图中选择文本时,控制台都会查看可能出现在UIMenuController中的每个可能的操作,并表示无法执行这些操作,但我的自定义操作除外:

 action = cut:, canPerform = false action = select:, canPerform = false (and so on, until...) action = defineWord, canPerform = true 

但生成的编辑菜单包含“复制”,“查找”,“共享”和“定义…”。 这些没有出现在控制台中,这让我觉得需要采用不同的方法。

请注意,我还尝试了子类化UITextView并根据需要使用上面的代码,但结果是一样的。

我出错的任何想法?

答案可能为时已晚,但对其他用户可能会有所帮助。 所以,我的解决方案是:我创建了自定义UITextView并重新定义了以下方法:

 - (BOOL)canBecomeFirstResponder { return YES; } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { //Here you can check for all action what you need return (action == @selector(yourCustomAction)) ? YES : NO; } 

这可能有助于所有提出此问题的人如何删除“复制”,“全选”等等。标准菜单项或UIResponderStandardEditActionscanPerformAction:已经返回false时仍然可见canPerformAction:

它与响应者链有关。 因为canPerformAction:为每个响应者调用,对于其中一些响应者,它可能在canPerformAction:返回true canPerformAction:作为默认值。

因此,为了检查它失败的地方,我通过覆盖这个canPerformAction:找到它canPerformAction:对于我在控制器中使用的每个元素

例如,在我的视图控制器中,我有一个webview ,我正在做的错误是我覆盖了canPerformAction:在委托方法中,即我正在做类似下面的事情

 extension viewcontroller: UIWebViewDelegate{ open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } 

但重点是你必须为元素而不是委托方法。

 extension UIView { func dropRoundCorners() { self.layer.cornerRadius = 10.0; self.clipsToBounds = true; } open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } extension UIImageView{ open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } extension UIScrollView{ open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } extension UISlider{ open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } extension UIWebView{ open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } } 

我希望这对那些坚持这个问题的人有用。

以下链接可能会帮助您了解详细信息:

UIResponder参考

非常重要的是阅读有关响应者的讨论

一些相关的东西