SwiftUI:Tabview,更改标签时保持状态

时间:2019-09-24 16:41:09

标签: swift swiftui

我创建一个带有多个标签的应用程序,每个标签都有一个Web视图。

我的网络视图:

struct WebView : UIViewRepresentable {

    let request: URLRequest


    func makeUIView(context: Context) -> WKWebView  {
        return WKWebView()
    }

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

}

im更改选项卡时,再次重新创建Web视图的问题。我只想创建一次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)
        }
    }

}

1 个答案:

答案 0 :(得分:2)

SwiftUI视图是值,因此它们总是被复制,但是WKWebView是对象,因此您不必重新创建它们(就像在UIViewRepresentable中一样),但是一旦创建便可以保留引用。

这是一个示例代码,显示了如何完成此操作。为了简化演示,我使用了static,但是缓存容器可以放在合适的位置。

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

}
相关问题