簡體   English   中英

同一結構 SwiftUI 的單獨實例

[英]Separate Instances of Same Struct SwiftUI

在 SwiftUI 中,如何創建同一結構的兩個單獨實例? 就我而言,這樣做的目的如下:我有一個用 SwiftUI 編寫的應用程序,它由一個標簽欄組成。 每個選項卡顯示不同的網頁。 當我創建標簽欄時,對於每個標簽 object,我當前將 URLrequest 作為結構的參數傳遞。 但是,我必須為我想要的每個網頁/選項卡創建一個具有幾乎相同代碼逐字記錄的新結構。 當我嘗試僅使用相同的結構時,由於結構的第一行,所有選項卡都顯示相同的網頁:

static var cache = [URL: WKWebView]()

但是,如果我刪除 static 關鍵字,我只是無法解決的錯誤。 我怎樣才能成功地做到這一點?

好的,這是我對所請求示例的繼續。 這是控制 webview 的結構。

struct WebView : UIViewRepresentable {
    
    static var cache = [URL: WKWebView]()

    let request: URLRequest
    
    func makeUIView(context: Context) -> WKWebView  {
        guard let url = request.url else {fatalError()}

        if let webView = WebView.cache[url] {
            return webView
        }

        let webView = WKWebView()
        WebView.cache[url] = webView
        return webView
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        if uiView.url == nil {
            uiView.load(request)
        }
    }
}

現在這里是內容視圖:

struct ContentView: View {
    var body: some View {
        TabView {
            WebView(request: URLRequest(url: URL(string: "https://www.google.com")!)).edgesIgnoringSafeArea(.all).tabItem {
                VStack {
                    Text("Google")
                }
            }
            
            WebView(request: URLRequest(url: URL(string: "https://www.apple.com")!)).edgesIgnoringSafeArea(.all).tabItem {
                VStack {
                    Text("Apple")
                }
            }
        }
    }
}

但是,這會導致兩個選項卡始終顯示同一頁面。 我顯然希望他們顯示指定的網址。 我怎么能做到這一點?

嘗試以下操作:

struct ContentView: View {
    var body: some View {
        TabView {
            webView(url: "https://www.google.com")
                .edgesIgnoringSafeArea(.all)
                .tabItem {
                    VStack {
                        Text("Google")
                    }
                }
            webView(url: "https://www.apple.com")
                .edgesIgnoringSafeArea(.all)
                .tabItem {
                    VStack {
                        Text("Apple")
                    }
                }
        }
    }

    func webView(url: String) -> some View {
        WebView(request: URLRequest(url: URL(string: url)!))
    }
}

注意:而不是強制解包URL(string: url)! 您可能需要提供默認 url 或默認視圖。 即使該站點是有效的,它也可能並不總是可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM