在视图结构中初始化成员

安和

我想在SwiftUI中使用WKWebView进行JavaScript处理。Swift变量初始化中,我正在执行以下操作:(我正在使用https://github.com/kylehickinson/SwiftUI-WebViewWKWebViewSwiftUI提供包装,这也增加了宝贵的布局约束。)

struct ContentView: View {

    var body: some View {
        WebView(webView: myWebView)
        .onAppear {
            let url = Bundle.main.url(forResource: "index", withExtension: "html")!
            myWebView.loadFileURL(url, allowingReadAccessTo: url)
            let request = URLRequest(url: url)
            myWebView.load(request)
        }
    }

    class JSHandler : NSObject, WKScriptMessageHandler {
        var contentView: ContentView?

        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            print("documentReady")
            contentView!.myWebView.evaluateJavaScript("<Long Script to Transfer Data>") { (result, error) in
            }
        }
    }

    let myJSHandler = JSHandler()

    var myWebView: WKWebView = {
        let config = WKWebViewConfiguration()
        let controller = WKUserContentController()
        controller.add(myJSHandler , name: "documentReady")
        config.userContentController = controller
        return WKWebView(frame: .zero, configuration: config)
    }()
}

但是后来我从实例成员那里得知,不能在类型上使用它,因为闭包没有引用self。我需要WKWebView具有专用的配置对象,所以我不能只使用其他构造函数。我需要对此做一个参考evaluateJavaScript

如何使这项工作?

编辑1:添加body并提及用于包装WKWebView的框架。

编辑2:添加了代码以阐明我需要两种通信方式,从WKWebView到本机应用程序通过WKScriptMessageHandler通过HTML文档准备就绪时得到通知)和从本机应用程序到WKWebViewvia evaluateJavaScript(在HTML文档准备就绪时传输数据)进行通信。

他的脾气

一种可能的解决方案是在以下位置配置WKWebView init

struct ContentView: View {
    private var myWebView: WKWebView

    init() {
        let config = WKWebViewConfiguration()
        let controller = WKUserContentController()
        controller.add(myJSHandler , name: "documentReady")
        config.userContentController = controller
        myWebView = WKWebView(frame: .zero, configuration: config)
    }

    var body: some View {
        WebView(webView: myWebView)
        .onAppear {
            let url = Bundle.main.url(forResource: "index", withExtension: "html")!
            myWebView.loadFileURL(url, allowingReadAccessTo: url)
            let request = URLRequest(url: url)
            myWebView.load(request)
        }
    }

    class JSHandler : NSObject, WKScriptMessageHandler {

        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            print("documentReady")
            message.webView?.evaluateJavaScript("<Long Script to Transfer Data>") { (result, error) in
            }
        }
    }

    let myJSHandler = JSHandler()

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Go结构中初始化成员

在构造函数中初始化成员

c ++:初始化成员结构的静态字段的正确方法

在成员函数中初始化成员变量

避免在需要之前初始化成员

用lambda初始化成员变量

C ++初始化成员数组

从参数初始化成员变量

“无效的初始化成员声明符”

是否可以在构造函数体内而不是初始化列表中初始化成员变量?

用类中的另一个成员初始化成员数组的大小

在类定义的开始或构造函数中初始化成员变量?

应该在类或构造函数中初始化成员吗?

在Go中初始化成员时是否只能使用返回值之一?

C ++:在constexpr构造函数中初始化成员数组

在类构造函数中初始化成员的快捷方式

如何在C ++中初始化成员的构造函数参数

常量表达式中带有未初始化成员的“默认”构造函数

为什么收到此警告?“未在此构造函数中初始化成员'x'”

C++ 11 标准 - 在头文件中初始化成员变量

为什么首先在C ++中初始化成员类?

构造函数是否必须在C ++中初始化成员变量?

在Dart中的可选参数构造函数中使用构造函数初始化成员

如何在SML状态或状态机中添加/初始化成员?

当初始化列表中的参数不可用时,如何初始化成员对象?

是否有可能阻止集合初始化成员的遗漏?

C ++内联初始化成员变量的正确方法

用默认值初始化成员引用

如何使GCC / Clang警告未初始化成员的使用?