首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wkwebview中的UIMenuItem #选择器方法崩溃

wkwebview中的UIMenuItem #选择器方法崩溃
EN

Stack Overflow用户
提问于 2017-08-07 03:08:26
回答 2查看 920关注 0票数 4

UIMenuItem选择器方法在iOS 11 beta SDK中崩溃。

-WKContentView highlightText:未识别的选择器发送到实例0x7f85df8f3200

方法定义:

代码语言:javascript
复制
func highlightText() 
{
  //
}

我尝试在UIMenuItem中添加WKWebView,

代码语言:javascript
复制
let menuItemHighlight = UIMenuItem.init(title: "Highlight", action: #selector(ContentWebkitView.highlightText))
UIMenuController.shared.menuItems = [menuItemHighlight]
EN

回答 2

Stack Overflow用户

发布于 2018-04-10 19:28:09

当我重写canPerformAction并检查我的自定义选择器时,我也得到了这个错误。在我的例子中,除了我的自定义菜单项之外,我想删除所有的菜单项。

代码语言:javascript
复制
class ViewController: UIViewController {

    @IBOutlet weak var webView: MyWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        loadWebView()
        setupCustomMenu()
    }

    func loadWebView() {
        let url = URL(string: "http://www.google.com")
        let request = URLRequest(url: url!)
        webView.load(request)
    }

    func setupCustomMenu() {
        let customMenuItem = UIMenuItem(title: "Foo", action:
            #selector(ViewController.customMenuTapped))
        UIMenuController.shared.menuItems = [customMenuItem]
        UIMenuController.shared.update()
    }

    @objc func customMenuTapped() {
        let yay = ""
        let alertView = UIAlertController(title: "Yay!!", message: yay, preferredStyle: .alert)
        alertView.addAction(UIAlertAction(title: "cool", style: .default, handler: nil))
        present(alertView, animated: true, completion: nil)
    }
}

class MyWebView: WKWebView {
    // turn off all other menu items
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-03-16 14:46:02

好了,我们终于让它适用于Swift 4:

  1. 在WKWebView子类中,添加以下属性和方法: // MARK:- Swizzling以避免响应链崩溃变量wkContentView: UIView?{返回self.subviewWithClassName("WKContentView") } swizzleResponderChainAction()
  2. 然后,向UIView添加一个扩展名(我将其放入与WKWebView子类相同的文件中,如果您愿意,可以将其设置为fileprivate ) // MARK:-扩展用于链接到wkContentView扩展UIView的swizzling部分,{/查找与className参数对应的子视图,递归地。subviewWithClassName(_ className: String) -> UIView?{如果NSStringFromClass(类型(of: self)) == className { self }UIView{表示子视图中的子视图{返回subview.subviewWithClassName(className) }返回nil } func swizzlePerformAction() {swizzleMethod(#选择器(CanPerformAction)),withSelector:#selector(swizzledCanPerformAction)) } swizzleMethod(_ currentSelector: Selector,withSelector newSelector: Selector) { if let currentMethod = self.instanceMethod(for: currentSelector),let newMethod = self.instanceMethod(for:newSelector) { let newImplementation = method_getImplementation(newMethod) method_setImplementation(currentMethod ),newImplementation) }{print(“未能找到originalSelector") }私有func instanceMethod(用于选择器:选择器) ->方法?{ let classType = type(of: self)返回class_getInstanceMethod(classType,selector) }} @objc私有函数swizzledCanPerformAction(_ action: Selector,withSender发件人:instanceMethod?) -> Bool {返回false }}

现在,UIMenuItem按预期工作:

但老实说,这真的像是一次黑客攻击,我希望苹果能解决这个问题:-/

感谢斯蒂芬-海尔纳的回答:https://stackoverflow.com/a/42985441/4670400

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45538886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档