首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改变量时,内容视图不会更新

更改变量时,内容视图不会更新
EN

Stack Overflow用户
提问于 2020-09-18 02:48:15
回答 2查看 455关注 0票数 0

我有一个基本的应用程序,显示一个网站,当我按下一个按钮,它应该会把我带到另一个链接,但它不知道为什么我尝试使用@state bool和更改它时,按钮被按下,但没有使用网站加载,但按钮不会改变网站

ContentView.swift

代码语言:javascript
复制
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

代码语言:javascript
复制
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>){
        
    }    
}
EN

回答 2

Stack Overflow用户

发布于 2020-09-18 03:01:48

以下是使用@ObservableObject的一个可能的解决方案

代码语言:javascript
复制
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))
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-18 03:55:37

因为您不会在websi更改时召回WebView,所以它不会执行任何操作。您需要向url添加一个@Binding标记,以便它知道要更新。然后你就可以调用

代码语言:javascript
复制
WebView(self.$websi)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63944468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档