WKWebView加载完swiftUI后隐藏视图

rn0zuynd  于 12个月前  发布在  Swift
关注(0)|答案(2)|浏览(93)

我试图隐藏启动屏幕一旦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被调用,因为我在调试控制台中看到“Done Loading”。

dzhpxtsq

dzhpxtsq1#

你的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变量,所以你的视图知道要刷新。

2w3rbyxf

2w3rbyxf2#

为了让委托方法`didFinish'被调用,我需要像这样实现WebView:

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    let url: URL
    @Binding var isLoading: Bool

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> WKWebView  {
        let wkwebView = WKWebView()
        wkwebView.navigationDelegate = context.coordinator
        wkwebView.load(URLRequest(url: url))
    
        return wkwebView
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
    }

    class Coordinator: NSObject, WKNavigationDelegate {
        var parent: WebView
        init(_ parent: WebView) {
            self.parent = parent
        }
        func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
            parent.isLoading = true
        }
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            parent.isLoading = false
        }
    }
}

那么可以这样称呼:

@State private var isLoading = false
//...
ActivityIndicator(isAnimating: $isLoading, style: .large)
WebView(url: URL(string: "https://stackoverflow.com)!, isLoading: $isLoading)

相关问题