我试图在 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
变量相关联,所以您的视图将知道要刷新。
为了调用委托方法 `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)