无法读取未定义的属性“messageHandlers" [英] Cannot read property 'messageHandlers' of undefined

查看:97
本文介绍了无法读取未定义的属性“messageHandlers"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将 JavaScript 变量传递给 Swift.我在 JavaScript & 中遇到错误搜索,但我没有得到任何结果.错误是:

I want to pass JavaScript variable to Swift. I get an error in JavaScript & search for that but I didn't get any result. The error is:

TypeError: 无法读取未定义的属性messageHandlers"

TypeError: Cannot read property 'messageHandlers' of undefined

有人可以帮忙吗?

我在 Xcode 中的代码:

My code in Xcode:

import UIKit
import WebKit

class ViewController: UIViewController,WKScriptMessageHandler,WKNavigationDelegate {

    var webView = WKWebView()
    override func viewDidLoad() {
        super.viewDidLoad() 

        webView.frame = view.bounds
        webView.navigationDelegate = self
        let url = URL(string: "MyUrl")!
        let urlRequest = URLRequest(url: url)
        webView.load(urlRequest)
        webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
        view.addSubview(webView)
        let userContentController = WKUserContentController()
        userContentController.add(self, name: "test")
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print("Name: \(message.name)")
        print("Body: \(message.body as! String)")
   }
}

在 JavaScript 中:

And in JavaScript:

click: event => {
window.webkit.messageHandlers.test.postMessage("hi");
}

推荐答案

添加测试"消息处理程序后,您需要将其添加到您的webView 的配置中,但是您并没有这样做所以.

After adding the "test" message handler, you need to add it to your webView's configuration, but you are not doing so.

通过将此消息处理程序包含到您的 WKUserContentController 对象中,您的 webView 将定义一个可以调用的新函数 window.webkit.messageHandlers.name.postMessage(messageBody)在所有帧中.

By including this message handler into your WKUserContentController object, your webView will define a new function window.webkit.messageHandlers.name.postMessage(messageBody) that can be called in all frames.

尝试将您的 viewDidLoad() 更改为以下内容:

Try changing your viewDidLoad() to the following:

override func viewDidLoad() {
    super.viewDidLoad() 

    let config = WKWebViewConfiguration()

    let userContentController = WKUserContentController()
    userContentController.add(self, name: "test")

    config.userContentController = userContentController

    webView = WKWebView(frame: view.bounds, configuration: config) // Create webView with the configuration

    webView.navigationDelegate = self
    let url = URL(string: "MyUrl")!
    let urlRequest = URLRequest(url: url)
    webView.load(urlRequest)
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

这篇关于无法读取未定义的属性“messageHandlers"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆