didFinish 委托未在 swiftUI 中被调用

didFinish delegate not getting called in swiftUI

我正试图在 WKWebView 完成加载时隐藏初始视图。所以在我的 WebView.swift 文件中,我有一个包含 didFinish 委托的协调器。我在 didFinish 委托函数中放置了一条打印语句,但是当 运行 应用程序时,一旦 webView 完成加载,我就没有在我的调试控制台中看到该打印语句。我也尝试过使用断点,但没有任何区别。请记住,我也没有显示任何错误。这是我的 WebView.swift 文件:

import SwiftUI
import WebKit

struct SwiftUiWebView: UIViewRepresentable {
    
    class Coordinator: NSObject, WKNavigationDelegate {
        let parent: SwiftUiWebView
        
        init(_ parent: SwiftUiWebView) {
            self.parent = parent
        }
        
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            print("Done loading")
        }
    }
    
    func makeCoordinator() -> SwiftUiWebView.Coordinator {
        Coordinator(self)
    }
    
    let url: URL?
    
    func makeUIView(context: Context) -> WKWebView {
        let prefs = WKWebpagePreferences()
        prefs.allowsContentJavaScript = true
        let config = WKWebViewConfiguration()
        config.defaultWebpagePreferences = prefs
        return WKWebView(frame: .zero, configuration: config)
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        guard let myURL = url else {
            return
        }
       
        let request = URLRequest(url: myURL)
        uiView.load(request)
    }
}

并且 SwiftUiWebviewContentView.swift 中被调用,例如:

SwiftUiWebView(url: URL(string: "www.mywebsitename.com"))

有人知道我做错了什么吗?

您需要在 WKWebView 上设置导航委托,否则它永远不会被调用。

您可以在 updateUIView 调用中执行此操作,方法是从上下文中访问您的协调器并将 navigationDelegate 设置为 context.coordinator

func updateUIView(_ uiView: WKWebView, context: Context) {
    guard let myURL = url else {
        return
    }

    uiView.navigationDelegate = context.coordinator // <- This sets the delegate

    let request = URLRequest(url: myURL)
    uiView.load(request)
}

完成后,如果您实现了所有 navigationDelegate 函数,则应调用它们。