在 WKWebView UIMenuController 中隐藏复制、查找、共享...

Posted

技术标签:

【中文标题】在 WKWebView UIMenuController 中隐藏复制、查找、共享...【英文标题】:Hiding Copy, Look Up, Share... in WKWebView UIMenuController 【发布时间】:2021-08-20 20:01:35 【问题描述】:

我正在为react-native-webview 进行 PR 以将自定义菜单项添加到 RNCWebView(它是 WKWebView 的子类)。它的工作原理是它添加了附加选项,但“复制|查找|共享...”总是出现。即使canPerformAction 为每个操作返回NO(注意canPerformAction 不会为copy 返回true/YES)

我遇到过很多其他帖子,例如:

WKWebView and UIMenuController Removing Copy, Look Up, and Share from UIMenuController Custom Cut, Copy & Paste operations for WKWebView

还有无数其他的只是建议使用 CSS 来隐藏整个菜单。我不想隐藏整个菜单,而只是“复制、查找和共享”,同时让我的自定义菜单在使用 WKWebView 时保留。

我的想法是,响应者链上还有其他一些类仍在将它们设置为 true,但我已尝试扩展和覆盖我所知道的尽可能多的选项,但这些选项仍然显示:


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
    


这些都不起作用。无论如何,这三个选项仍然出现。有谁知道哪个班级可以响应并添加这些选项?这似乎是一个常见问题,但我发现的所有帖子要么没有答案,要么完全过时。

【问题讨论】:

我可以删除复制、剪切、全选、粘贴项目。我认为您无法删除查找和共享项目。 显示您添加自定义menuItems 的行。 @ElTomato 我在这里从这个包中将它们添加到 WebView:github.com/react-native-webview/react-native-webview/pull/2101/… 那我提交解决方案后怎么办? 【参考方案1】:
// 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 对象并更改其类名。 将自定义菜单项添加到视图控制器。

【讨论】:

以上是关于在 WKWebView UIMenuController 中隐藏复制、查找、共享...的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView 实例可以在加载时显示网页吗?

WKWebView 添加为子视图

在 WKWebView 中处理 JavaScript 事件

无法使用 WKWebView 在 Safari 中打开外部链接

WKWebView 那些坑

WKWebView 那些坑