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

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

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

还有无数其他的只是建议使用 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
    }
}

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

【问题讨论】:

标签: swift objective-c react-native wkwebview


【解决方案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")
    }
}
  1. 首先,子类WKWebView,删除所有菜单项。
  2. 创建一个WKWebView 的IBOutlet 对象并更改其类名。
  3. 将自定义菜单项添加到视图控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2019-11-16
    相关资源
    最近更新 更多