因此,我将WKWebView
包装在UIViewRepresentable
中,并构建了一个协调器,以便访问其导航委托的功能。在webView(_:didFinish:)
函数中,我试图更新视图的didFinishLoading
变量。如果我在分配后立即打印,它将打印true
-预期的行为。但是,在父视图中,当我调用getHTML
函数时,即使我等到WKWebView完全加载后,它也会打印false
。
这是代码:
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
@Binding var link: String
init(link: Binding<String>) {
self._link = link
}
private var didFinishLoading: Bool = false
let webView = WKWebView()
func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
self.webView.load(URLRequest(url: URL(string: self.link)!))
self.webView.navigationDelegate = context.coordinator
return self.webView
}
func updateUIView(_ uiView: WKWebView,context: UIViewRepresentableContext<WebView>) {
return
}
class Coordinator: NSObject,WKNavigationDelegate {
private var webView: WebView
init(_ webView: WebView) {
self.webView = webView
}
func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!) {
print("WebView: navigation finished")
self.webView.didFinishLoading = true
}
}
func makeCoordinator() -> WebView.Coordinator {
Coordinator(self)
}
func getHTML(completionHandler: @escaping (Any?) -> ()) {
print(self.didFinishLoading)
if (self.didFinishLoading) {
self.webView.evaluateJavaScript(
"""
document.documentElement.outerhtml.toString()
"""
) { html,error in
if error != nil {
print("WebView error: \(error!)")
completionHandler(nil)
} else {
completionHandler(html)
}
}
}
}
}
struct WebView_Previews: PreviewProvider {
@State static var link = "https://apple.com"
static var previews: some View {
WebView(link: $link)
}
}