如何创建自定义 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 添加自定义菜单项?