簡體   English   中英

更改變量時內容視圖不會更新

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

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