如何创建自定义 UIMenuController 仅包含默认项目以外的自定义项目?

Posted

技术标签:

【中文标题】如何创建自定义 UIMenuController 仅包含默认项目以外的自定义项目?【英文标题】:how to create Custom UIMenuController with only custom items other than default? 【发布时间】:2016-06-21 13:15:05 【问题描述】:

每当用户选择任何文本时,我都需要在 uiwebview 上显示菜单项。

我试过了

let highlightMenuItem = UIMenuItem(title: "Highlight", action: #selector(ViewController.hightlight))

UIMenuController.sharedMenuController().menuItems = [highlightMenuItem]

但这只会在默认现有菜单项的基础上附加更多菜单项。像这样

有没有办法只用复制、突出显示和注释菜单项来实现这一点?

【问题讨论】:

【参考方案1】:

您可以通过继承 UIWebView 并覆盖 canPerformAction (Swift 3) 来实现这一点。然后,您需要做的就是返回 false 以获取您想要禁用的任何操作。

例子:

class EditedUIMenuWebView: UIWebView 

  override func canPerformAction(_ action: Selector, withSender sender: AnyObject?) -> Bool 
    if action == #selector(cut(_:)) 
      return false
    
    if action == #selector(paste(_:)) 
      return false
    
    if action == #selector(select(_:)) 
      return false
    
    if action == #selector(selectAll(_:)) 
      return false
    
    ...

    return super.canPerformAction(action, withSender: sender)
  


如果有任何问题,欢迎提问!

编辑如果您想禁用所有操作,但只有一些操作可能更容易在canPerformAction 中返回false,然后为您想要的操作返回true

override func canPerformAction(_ action: Selector, withSender sender: AnyObject?) -> Bool 
   if action == #selector(copy(_:)) || action == #selector(customMethod(_:)) 
     return true
   
   ...
   return false
 

【讨论】:

感谢@Ike10,进行编辑,是的,这是忽略其他操作的好方法。并且只保留我们的自定义。 如果你想过滤掉复制动作,这不起作用。为了过滤复制动作,你需要显示你自己的菜单控制器 我已经在 UITextView 中尝试过,但它不起作用。我可以添加菜单项,但不能摆脱现有的。是否有其他解决方案或 UITextView 的工作方式不同?

以上是关于如何创建自定义 UIMenuController 仅包含默认项目以外的自定义项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIMenuController 的自定义操作中获取点击的表格视图单元格

在哪里向 UIMenuController 添加自定义菜单项?

自定义 UIMenuController

是否可以自定义 UIMenuController 的颜色?

在 iOS 的 UIMenuController 开头附加自定义 UIMenuItems

您如何真正从 UIMenuController 中删除 Copy