簡體   English   中英

WebView 隱藏在另一個視圖下時重新加載 SwiftUI

[英]WebView reloading when hiding under another view SwiftUI

我有一個帶有 WebView 的屏幕(我只是在其中顯示一個網站)和另一個顯示信息的屏幕(對於這個例子是一個虛擬設計),它從上到下,作為窗簾,並以相同的方式處理。

問題是每次我顯示涵蓋 web 視圖的界面時,網站都會重新加載。 你可以在谷歌中搜索一些東西來測試它,按下向上按鈕並再次按下它以再次查看該網站,你會看到它回到了起點。

我想我理解這是因為 Object 正在重新創建,但我的問題是如何防止重新加載網站?

另外,關於答案,我有時需要用新的 URL 重新加載網站(因為現在每次我隱藏它時都會重新加載這個功能有效),有時,就像在這個例子中,我不想要它重新加載。 我怎樣才能做到這一點?

我的界面代碼(作為 Interface1 主屏幕):

import SwiftUI

struct Interface1: View {
    @State var showWebsite: Bool = true
    var body: some View {
        VStack {
            Button(showWebsite ? "Show interface 2" : "Show website") {
                withAnimation {
                    showWebsite.toggle()
                }
            }
            ZStack {
                WebView(url: "https://www.google.com")
                Interface2(showWebsite: $showWebsite)
                    .offset(y: showWebsite ? -UIScreen.main.bounds.height : 0 )
            }
        }
    }
}

struct Interface2: View {
    @Binding var showWebsite: Bool
    var body: some View {
        Circle()
            .background(Color.blue)
    }
}

這里是 SwiftUI 的 Webview 包裝器:

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    var url: String
    let webView = WKWebView()
    
    func makeUIView(context: Context) -> WKWebView  {
        webView.evaluateJavaScript("navigator.userAgent") { (result, error) in
            print(result as! String)
        }
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        let request = URLRequest(url: URL(string:url)!)
        uiView.load(request)
    }
}

問題是您試圖保留webView變量。

只需將聲明移至make

func makeUIView(context: Context) -> WKWebView  {
    let webView = WKWebView() //<-------Here
    webView.evaluateJavaScript("navigator.userAgent") { (result, error) in
        print(result as! String)
    }
    return webView
}

如果您希望能夠更改 URL 將 url 變量更改為@Binding

struct WebView: UIViewRepresentable {
    @Binding var url: String
    func makeUIView(context: Context) -> WKWebView  {
        let webView = WKWebView()
        webView.evaluateJavaScript("navigator.userAgent") { (result, error) in
            print(result as! String)
        }
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        let request = URLRequest(url: URL(string:url)!)
        uiView.load(request)
    }
}

用“新”url 更新“真相之源”。

struct Interface1: View {
    @State var showWebsite: Bool = true
    @State var url: String = "https://www.google.com"
    var body: some View {
        VStack {
            Button(showWebsite ? "Show interface 2" : "Show website") {
                withAnimation {
                    showWebsite.toggle()
                }
            }
            Button("load URL", action: {
                url = ["https://www.google.com", "https://www.apple.com"].randomElement()!
            })
            ZStack {
                WebView(url: $url)
                Interface2(showWebsite: $showWebsite)
                    .offset(y: showWebsite ? -UIScreen.main.bounds.height : 0 )
            }
        }
    }
}

暫無
暫無

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

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