在 SwiftUI 中加载网站时加载活动指示器

Posted

技术标签:

【中文标题】在 SwiftUI 中加载网站时加载活动指示器【英文标题】:Load an Activity Indicator while website is loading in SwiftUI 【发布时间】:2020-02-22 01:51:50 【问题描述】:

我有一个显示 web 视图的基本列表。我想添加一个在网页加载时显示的活动指示器。这是我创建的代码。

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")
    

谢谢!

【问题讨论】:

欢迎来到 Stack Overflow!谢谢采纳! 【参考方案1】:

这里有一些应该做你想做的事。 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
        
    

【讨论】:

【参考方案2】:

您需要将Coordinator 添加到您的UIViewRepresentable

我认为这个问题的答案给了你正确的想法。

SwiftUI WKWebView detect url changing

【讨论】:

以上是关于在 SwiftUI 中加载网站时加载活动指示器的主要内容,如果未能解决你的问题,请参考以下文章

PDF uiwebview 加载时未显示活动指示器

在表格视图单元格中显示活动指示器

在颤振加载中加载更多列表,但用户界面没有改变

iOS 状态栏中的加载指示器

SFSafariViewController 在推入 UINavigationController 时隐藏网络活动指示器

加载网页时,活动指示器不会隐藏