WKWebView 加载完 swiftUI 后隐藏视图

问题描述 投票:0回答:2

我试图在 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
被调用,因为我在调试控制台中看到“完成加载”。

swift swiftui wkwebview
2个回答
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) {
             ....
          }
       }
    }
}
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
变量相关联,所以您的视图将知道要刷新。


0
投票

为了调用委托方法 `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)
© www.soinside.com 2019 - 2024. All rights reserved.