当 WKWebView 完成加载 swiftUI 时隐藏视图

Hiding view when WKWebView has finished loading swiftUI

我试图在 WKWebView 完成加载后隐藏启动屏幕。我找到了一种方法来检测 WKWebView 何时完成 didFinish 委托的加载,但我一直隐藏启动屏幕。目前,一旦 WKWebView 完成加载,它将 webViewFinishedLoading 设置为 true,而在 ContentView.swift 中,如果 webViewFinishedLoading 设置为 false,它应该只显示视图。但现在即使在 WKWebView 完成加载后它也只显示启动屏幕。这是我的代码:

ContentView.swift:

var webViewFinishedLoading = false
struct ContentView: View {
    var body: some View {
       SwiftUiWebView(url: URL(string: "myUrl"))
       ZStack {
          if (!webViewFinishedLoading) {
             ....
          }
       }
    }
}

WebView.swift

....
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    if (webView.isLoading) {
       return
    }
    print("Done Loading")
    webViewFinishedLoading = true
}
....

我知道 didFinish 被调用是因为我在调试控制台中看到“加载完成”。

你的 View 不会知道重新加载,除非它被 @State 属性 或 ObservableObject 之类的东西触发。您还没有真正从 SwiftUiWebView 中提供足够的代码来显示所有内容,但这里是需要发生的事情的要点:

struct ContentView: View {
    @State var webViewFinishedLoading = false

    var body: some View {
       SwiftUiWebView(url: URL(string: "myUrl"), finishedLoading: $webViewFinishedLoading)
       ZStack {
          if (!webViewFinishedLoading) {
             ....
          }
       }
    }
}
struct SwiftUiWebView : UIViewRepresentable {
  var url: URL
  var finishedLoading: Binding<Bool>

  //...
} 

然后,您需要将 finishedLoading 绑定传递给您的 Web 视图委托,并在完成加载后将其 .wrappedValue 设置为 true

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    if (webView.isLoading) {
       return
    }
    print("Done Loading")
    finishedLoading.wrappedValue = true
}

因为它绑定到一个 @State 变量,您的视图将知道要刷新。