首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UIViewRepresentable方法解雇onChange不起作用

使用UIViewRepresentable方法解雇onChange不起作用
EN

Stack Overflow用户
提问于 2022-06-02 05:03:40
回答 1查看 263关注 0票数 -1

我有一个UIViewRepresentable,当某个值发生变化时,我需要取消它,我使用了.onChange方法,它不起作用。但是onChange方法调用成功。

主视图

代码语言:javascript
复制
class ViewModel:ObservableObject {
    @Published var urlHasChanged:Bool = false
    @Published var isShowWebView:Bool = false
}

struct MainView : View {
    @ObservedObject var viewModel = ViewModel()
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        NavigationView {
            VStack {
                Button {
                    viewModel.isShowWebView = true
                } label: {
                    Text("show web view")
                }
                .background(NavigationLink( destination:
                                                WebView(viewModel: viewModel)
                    .onChange(of: viewModel.urlHasChanged, perform: { newValue in
                        print("called")
                        self.presentationMode.wrappedValue.dismiss()
                    })
                    ,isActive: $viewModel.isShowWebView, label: {
                    EmptyView()
                }).opacity(0))

            }
        }
    }

}

UIViewRepresentable

代码语言:javascript
复制
struct WebView: UIViewRepresentable {

    var viewModel : ViewModel

    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }

    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        context.coordinator.viewModel = viewModel
        webView.navigationDelegate = context.coordinator
        webView.load(URLRequest(url: URL(string: "https://www.google.com/")!))
        return webView
    }

    func updateUIView(_ webView: WKWebView, context: Context) {
        let request = URLRequest(url: URL(string: "https://www.google.com/")!)
        webView.load(request)
    }


    class Coordinator : NSObject, WKNavigationDelegate {
        var viewModel : ViewModel?

        func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
            //print("webview url \(webView.url)")
        }

        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if let host = navigationAction.request.url?.absoluteString{
                if host.contains("google.com") {
                    decisionHandler(.allow)
                    return
                }else{
                    viewModel?.urlHasChanged = true
                    decisionHandler(.cancel)
                    return
                }
            }else{
                decisionHandler(.cancel)
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 05:10:54

不是演示文稿,而是把激活标志转回来,就像

代码语言:javascript
复制
.onChange(of: viewModel.urlHasChanged, perform: { newValue in
    print("called")
    viewModel.isShowWebView = false // << here !!
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72470906

复制
相关文章

相似问题

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