[英]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.