我创建了一个带有多个选项卡的应用程序,每个选项卡都有一个 webview。
我的网页 View :
struct WebView : UIViewRepresentable {
let request: URLRequest
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.load(request)
}
}
我更改选项卡时出现的问题, WebView 再次重新创建。我只想创建一次 webview,然后每次更改选项卡时,它都会保持状态并且 webview 不会每次都重新充电
我的代码:
struct ContentView: View {
var body: some View {
TabView {
WebView(request: URLRequest(url: URL(string: "https://www.google.com/")!))
.tabItem {
Image(systemName: "1.circle")
Text("Messenger")
}.tag(0)
WebView(request: URLRequest(url: URL(string: "https://facebook.com/login")!))
.tabItem {
Image(systemName: "2.circle")
Text("Trello")
}.tag(1)
}
}
}
最佳答案
嗯,SwiftUI View 是值,因此它们总是被复制,但 WKWebView 是对象,因此您不必重新创建它们(就像在 UIViewRepresentable 中所做的那样),但您可以在创建后在某处保留引用。
下面是一个示例代码,展示了如何完成此操作。为了演示的简单性,我使用了静态,但缓存容器可以留在任何合适的地方。
struct WebView : UIViewRepresentable {
// static is only for demo, this can be some external model
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)
}
}
}
关于SwiftUI:Tabview,更改选项卡时保持状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084788/