[英]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.