[英]Content view is not updating when the variable is changed
我有一個顯示網站的基本應用程序,當我按下按鈕時,它應該將我發送到另一個鏈接,但它不知道為什么我嘗試使用 @state bool 並在按下按鈕時更改它但沒有使用網站加載但按鈕確實如此不改變網站
內容視圖.swift
import SwiftUI
import WebKit
import Foundation
struct ContentView: View {
@State private var selectedSegment = 0
@State var websi = "172.20.10.3"
@State private var websites = ["192.168.8.125", "192.168.8.125/Receipts.php","192.168.8.125/myqr.php"]
@State private var sssa = ["Home","MyRecipts","MyQr"]
@State var updater: Bool
var body: some View {
HStack {
NavigationView{
VStack{
Button(action: {
self.websi = "172.20.10.3/myqe.php"
self.updater.toggle()
}) {
Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
} .pickerStyle(SegmentedPickerStyle());
/* Text("Selected value is: \(websites[selectedSegment])").padding()*/
Webview(url: "http://\(websi)")
}
}
.padding(.top, -44.0)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView( updater: false)
.padding(.top, -68.0)
}
}
Webview.swift
import Foundation
import SwiftUI
import WebKit
struct Webview: UIViewRepresentable {
var url: String
func makeUIView(context: Context) -> WKWebView {
guard let url = URL(string: self.url) else{
return WKWebView()
}
let request = URLRequest(url: url)
let wkWebView = WKWebView()
wkWebView.load(request)
return wkWebView
}
func updateUIView(_ uiView: WKWebView, context:
UIViewRepresentableContext<Webview>){
}
}
這是使用@ObservableObject
的可能解決方案:
struct WebView: UIViewRepresentable {
@ObservedObject var viewModel: ViewModel
func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
return WKWebView()
}
func updateUIView(_ webView: WKWebView, context: UIViewRepresentableContext<WebView>) {
if let url = URL(string: viewModel.url) {
webView.load(URLRequest(url: url))
}
}
}
extension WebView {
class ViewModel: ObservableObject {
@Published var url: String
init(url: String) {
self.url = url
}
}
}
struct ContentView: View {
@State private var currentWebsite = "https://google.com"
var body: some View {
VStack {
Button("Change") {
self.currentWebsite = "https://apple.com"
}
WebView(viewModel: .init(url: currentWebsite))
}
}
}
因為當 websi 更改時您沒有召回 WebView,所以它不會做任何事情。 您需要向 url 添加 @Binding 標記,以便它知道要更新。 然后你可以打電話
WebView(self.$websi)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.