簡體   English   中英

參數類型不符合預期類型“WKScriptMessageHandler”

[英]Argument Type does not conform to expected type 'WKScriptMessageHandler'

我正在嘗試 Swift 和 Javascript 與 SwiftUI 接口之間的雙向集成。
這是將 WebKit 與 SwiftUI 連接。

import SwiftUI
import WebKit

struct ggWebView : UIViewRepresentable {

    let filePath: String

    func makeUIView(context: Context) -> WKWebView  {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.configuration.userContentController.add(self, name: "jsHandler")
        let bundleURL = Bundle.main.resourceURL!.absoluteURL
        let html = bundleURL.appendingPathComponent(filePath)
        uiView.loadFileURL(html, allowingReadAccessTo:bundleURL)
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "jsHandler"{
            print(message.body)
        }
    }
}

userContentController.add(self, name: "jsHandler")self顯示錯誤, Argument type 'ggWebView' does not conform to expected type 'WKScriptMessageHandler'

由於WKScriptMessageHandler要求實現它的 object 從NSObject繼承,因此最好創建一個單獨的 class ContentController來實現這些協議,而不是更改GgWebView的類型。

import SwiftUI
import WebKit

struct GgWebView: UIViewRepresentable {

    let filePath: String
    let contentController = ContentController()

    func makeUIView(context: Context) -> WKWebView  {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.configuration.userContentController.add(contentController, name: "jsHandler")
        let bundleURL = Bundle.main.resourceURL!.absoluteURL
        let html = bundleURL.appendingPathComponent(filePath)
        uiView.loadFileURL(html, allowingReadAccessTo:bundleURL)
    }

    class ContentController: NSObject, WKScriptMessageHandler {
        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            if message.name == "jsHandler"{
                print(message.body)
            }
        }
    }
}

您必須確認ggWebView (順便說一句,這不是 class 的最佳名稱,因為它應該以大寫字母開頭)到WKScriptMessageHandler協議並實現func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)方法。 您必須將ggWebView的類型從structure更改為class 我可以看到您已經添加了userContentController(_:didReceive:)方法,因此您只需將 class 簽名更新為:

class ggWebView: UIViewRepresentable, WKScriptMessageHandler {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM