Webview 在SwiftUI中加载网站时加载活动指示器
我有一个显示网络视图的基本列表。我想添加一个在网页加载时显示的活动指示器。这是我创建的代码Webview 在SwiftUI中加载网站时加载活动指示器,webview,swiftui,xcode11,uiactivityindicatorview,Webview,Swiftui,Xcode11,Uiactivityindicatorview,我有一个显示网络视图的基本列表。我想添加一个在网页加载时显示的活动指示器。这是我创建的代码 import SwiftUI import WebKit struct WebView: UIViewRepresentable { var url: String // makeUIView func func makeUIView(context: Context) -> WKWebView { guard let url = URL(string:
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
var url: String
// makeUIView func
func makeUIView(context: Context) -> WKWebView {
guard let url = URL(string: self.url) else {
return WKWebView()
}
let request = URLRequest(url: url)
let wkWebView = WKWebView()
wkWebView.load(request)
return wkWebView
}
// updateUIView func
func updateUIView(_ uiView: WKWebView, context: Context) {
}
}
struct WebView_Preview: PreviewProvider {
static var previews: some View {
WebView(url: "https://www.google.com")
}
}
谢谢大家! 您将需要向您的
UIViewRepresentable
中添加一个协调员
我认为这个问题的答案给了你正确的想法
这里有一些你想做的事情。WebView在Coordinator类中有一个委托。它更改了一个绑定,ContentView可以对该绑定做出适当的反应。目前,它只是一个显示状态原始值的文本,但可以用某种类型的活动指示器来替换
struct ContentView: View {
@State var urlString = ""
@State var workState = WebView.WorkState.initial
var body: some View {
VStack(spacing: 20) {
WebView(urlString: self.$urlString, workState: self.$workState)
Button("Play") {
self.urlString = "https://www.example.com/"
}
Text("Current work = " + self.workState.rawValue)
}
}
}
struct WebView: UIViewRepresentable {
enum WorkState: String {
case initial
case done
case working
case errorOccurred
}
@Binding var urlString: String
@Binding var workState: WorkState
func makeUIView(context: Context) -> WKWebView {
let webView = WKWebView()
webView.navigationDelegate = context.coordinator
return webView
}
func updateUIView(_ uiView: WKWebView, context: Context) {
switch self.workState {
case .initial:
if let url = URL(string: self.urlString) {
uiView.load(URLRequest(url: url))
}
default:
break
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, WKNavigationDelegate {
var parent: WebView
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
self.parent.workState = .working
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
self.parent.workState = .errorOccurred
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.parent.workState = .done
}
init(_ parent: WebView) {
self.parent = parent
}
}
}
欢迎来到堆栈溢出!谢谢接受!