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

Amy*_*Amy 3 swift wkwebview swiftui

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

ContentView.swift:

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

WebView.swift

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

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

jn_*_*pdx 5

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) {
             ....
          }
       }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct SwiftUiWebView : UIViewRepresentable {
  var url: URL
  var finishedLoading: Binding<Bool>

  //...
} 
Run Code Online (Sandbox Code Playgroud)

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

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

因为它与变量绑定@State,所以您的视图将知道刷新。