我有一个带有WKWebView的应用程序。在此应用程序中,我自定义UIMenuController中提供的选项。无论我做什么,Web View 似乎都将“复制”和“定义”选项添加到菜单中。如果我将自己设置为第一响应者,并且对所有内容均返回否,则仍会得到复制并定义选项。而且我已经实现了自己的复制选项,该选项根据用户的喜好和选择的内容来做特殊的事情。有没有办法删除这些额外的选项?

更新:我已将其归档为雷达18487289。

最佳答案

对于iOS 11,只需将WKWebView子类化并覆盖canPerformAction以返回false:

class WebView : WKWebView {
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

对于iOS 10或更早版本,请使用WKContentViewcanPerformAction方法:
@objc private extension UIResponder {
    func swizzle_canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

guard let viewClass = NSClassFromString("WKContentView") as? UIView.Type else { return }
method_exchangeImplementations(
    class_getInstanceMethod(viewClass, #selector(UIResponder.canPerformAction))!,
    class_getInstanceMethod(UIResponder.self, #selector(UIResponder.swizzle_canPerformAction))!
)

删除这些Web View 的内置菜单项后,您可以像平常一样通过UIMenuController.shared添加自定义菜单项。

10-08 05:22