我正在为react-native-webview的PR添加自定义菜单项到RNCWebView(这是WKWebView的子类)。它的工作原理是,它增加了额外的选项,但"复制|查找|分享…"总是出现。即使canPerformAction
对每个动作返回NO
(注意canPerformAction
对copy
不返回true/YES)
我看到过很多其他的帖子,比如:
- WKWebView和UIMenuController
- 从UIMenuController中删除拷贝、查找和共享
- 自定义剪切,复制&WKWebView 的粘贴操作
和无数其他只是建议使用CSS来隐藏整个菜单。我并不是想要隐藏整个菜单,而只是"复制,查找和共享"。而让我的自定义的保留,而使用WKWebView。
我的想法是,有一些其他类的响应链,仍然设置他们为真,但我已经尝试扩展和重写尽可能多的我知道,仍然这些选项显示:
extension UIView {
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
extension UITextView {
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
extension UIImageView{
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
extension UIScrollView{
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
extension UISlider{
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
extension UIWebView{
open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
@objc private extension UIResponder {
func swizzle_canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
这些都不起作用。无论如何,这三个选项仍然会出现。有人知道什么类可以响应和添加这些选项吗?这似乎是一个常见的问题,但我找到的所有帖子要么没有答案,要么已经过时了。
// WKWebView subclass //
import WebKit
import UIKit
class MyWebView: WKWebView {
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return false
}
}
// View controller //
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
// MARK: - Variables
var helloMenu = UIMenuItem()
// MARK: - IBOutlet
@IBOutlet weak var myWebView: MyWebView!
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
myWebView.navigationDelegate = self
helloMenu = UIMenuItem(title: "Hello", action: #selector(sayHello))
UIMenuController.shared.menuItems = [helloMenu]
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let urlStr = "https://www.google.com/"
if let url = URL(string: urlStr) {
let request = URLRequest(url: url)
myWebView.load(request)
}
}
// MARK: - Custom menu
@objc func sayHello() {
print("Hello")
}
}
- 首先,子类
WKWebView
,删除所有菜单项。 - 为
WKWebView
创建一个IBOutlet对象,并更改它的类名。 - 添加自定义菜单项到视图控制器