4

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

在此处输入图像描述

有各种线程专门用于此特定任务,但尽管有成千上万的视图和不同的结果,包括它不能为足够多的人工作......似乎没有一个解决方案可以始终如一地工作对于 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)
}

这是我的相关代码的其余部分:

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)
    }
}

在我看来DidLoad:

articleTextView.delegate = self
addCustomMenu()

我也将我的 viewController 设置为符合 UITextViewDelegate 。有些人建议,如果您只是将 TextView 子类化,这将以某种方式起作用。我无法让它发挥作用,所以如果这确实是答案,有人可以提供一个例子吗?

同样,我知道这可能看起来像重复,但上述解决方案似乎已停止使用 iOS 更新。

谢谢。

4

1 回答 1

3

要感谢@gaurav 他对此的回答,这在我对 SO 的追捕中一定逃脱了我:https ://stackoverflow.com/a/46470592/7134142

关键的代码是这样的,它扩展了 UITextView,而不是继承它:

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

在我的视图控制器中重写 canPerformAction 是不必要的,上面的代码仍然允许您添加自定义菜单项。这就是我最终的结果:

在此处输入图像描述

于 2018-06-24T23:32:20.333 回答