![](/img/trans.png)
[英]Passing different instances of same Model to same SwiftUI View struct
[英]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.