我正在尝试配置UIMenuController的菜单项以实现类似于Medium的iOS功能的功能:
有很多线程专用于此特定任务,但是尽管有成千上万的视图和不同的结果,包括它不能为足够多的人工作...似乎没有解决方案对于UITextView始终有效。
我已经能够添加一个自定义菜单选项“ printToConsole”,但是我无法禁用Apple的标准菜单项,例如剪切,复制,粘贴, B I U,等等:
共识似乎是我应该重写canPerformAction以禁用这些默认菜单项,但这似乎不起作用:
++
这是我相关代码的其余部分:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
print("canPerformAction being called")
if action == #selector(cut(_:)) {
return false
}
if action == #selector(copy(_:)) {
return false
}
if action == #selector(select(_:)) {
return false
}
if action == #selector(paste(_:)) {
return false
}
if action == #selector(replacementObject(for:)) {
return false
}
if action == #selector(selectAll(_:)) {
return false
}
if action == #selector(printToConsole) {
return true
}
return super.canPerformAction(action, withSender: sender)
}
在我的viewDidLoad中:
func addCustomMenu() {
let consolePrintAction = UIMenuItem(title: "Print To Console", action: #selector(printToConsole))
UIMenuController.shared.menuItems = [consolePrintAction]
UIMenuController.shared.update()
}
@objc func printToConsole() {
if let range = articleTextView.selectedTextRange, let selectedText = articleTextView.text(in: range) {
print(selectedText)
}
}
我也将viewController设置为也符合UITextViewDelegate。有人建议,如果您只是将TextView子类化,那么它将以某种方式起作用。我一直无法解决这个问题,因此,如果这确实是答案,那么有人可以提供示例吗?
同样,我知道这似乎是重复的,但是上述解决方案似乎已停止使用iOS更新。
谢谢。
答案 0 :(得分:0)
要感谢@gaurav对此问题的回答,这一定使我在搜寻SO https://stackoverflow.com/a/46470592/7134142
时逃脱了关键代码是这个,它扩展了UITextView,而不是对其进行子类化:
extension UITextView {
open override func canPerformAction(_ action: Selector, withSender
sender: Any?) -> Bool {
return false
}
在我的视图控制器中覆盖canPerformAction是不必要的,并且上面的代码仍然允许您添加自定义菜单项。这就是我最终得到的: