SwiftUI:Tabview,更改选项卡时保持状态

标签 swift swiftui

我创建了一个带有多个选项卡的应用程序,每个选项卡都有一个 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/

相关文章:

ios - 如何在自定义类按钮上添加渐变?

ios - SwiftUI:如何让项目的拖放重新排序工作?

ios - 响应 SwiftUI 中的按键事件

swift - 如何修复 Swift 5.1 中的 "Use of undeclared type"错误?

ios - SwiftUI/Combine 没有从 @Published 更新到 @ObservedObject

json - 使用 SwiftUI 解码 API 调用中的嵌套 JSON 响应时遇到问题

ios - "How to retrieve an url from Firebase Database BEFORE load WebView in Swift?"

ios - swift 2.0 : Initialize a CBCharacteristic?

ios - 为什么显示 TableView 但不显示单元格?

ios - Scenekit - 软化物理主体