无法在UITextView的UIMenuController中禁用默认的UIMenuItems

时间:2018-06-24 22:59:15

标签: ios swift uitextview uimenucontroller uimenuitem

我正在尝试配置UIMenuController的菜单项以实现类似于Medium的iOS功能的功能:

enter image description here

有很多线程专用于此特定任务,但是尽管有成千上万的视图和不同的结果,包括它不能为足够多的人工作...似乎没有解决方案对于UITextView始终有效。

我已经能够添加一个自定义菜单选项“ printToConsole”,但是我无法禁用Apple的标准菜单项,例如剪切,复制,粘贴, B I U,等等:

enter image description here

共识似乎是我应该重写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更新。

谢谢。

1 个答案:

答案 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是不必要的,并且上面的代码仍然允许您添加自定义菜单项。这就是我最终得到的:

enter image description here