从WKWebView操作导航SwiftUI页面

问题描述 投票:1回答:2

我是IOS编程和SwiftUI的新手。我想学习SwiftUI。我有一个WKWebView。我想根据WKWebView中的URL更改来更改SwiftUI页面。正如您在下面看到的,我做了很多工作。但是我在导航方面很挣扎。

struct ContentView: View, Listener {
    func onFetched() {
        NavigationLink(destination: MainView()) {/* HERE this is not working. 
App never goes to MainView.swift page.*/
            Text("Show Detail View")
        }
    }

    var body: some View {
        NavigationView {
            VStack {
                WebView(authListener: self)
            }.navigationBarTitle(Text("PEAKUP Velocity"))
        }
    }
}

struct WebView: UIViewRepresentable {
     var listener: Listener

     @ObservedObject var observe = observable() 

    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
         observe.observation = uiView.observe(\WKWebView.url, options: .new) { view, change in
             if let url = view.url {
                self.observe.loggedIn = true     // We loaded the page
                self.listener.onFetched()
                uiView.isHidden = true
            }
        }
        uiView.load("https://google.com")
    }
}

protocol Listener {
    func onFetched()
}

更新:我在onFetched()中尝试过此方法:

 NavigationLink(destination: MainView()) { Text("") }''''

 And I tried this piece of code:
 NavigationView {
        NavigationLink(destination: SecondView()){
            Text("Navigation Link")
        }
    }
ios swift wkwebview swiftui navigationlink
2个回答
1
投票

** 免责声明 我没有在SwiftUI的上下文中使用WKWebviews,但我认为这是正确的。 **

我建议您调查WKNavigationDelegate。除非您的类的类型为WKWebView,否则您需要确保分配一个委托来处理任何导航事件。

也许您会发现以下文章有帮助:https://www.hackingwithswift.com/articles/112/the-ultimate-guide-to-wkwebview


0
投票

您是否可以尝试像这样更改onFetched()方法:

struct ContentView: View, Listener {
    func onFetched() {
        self.presentation(Modal(MainView(), onDismiss: {
             print("Dismissed")
        }))
    }

    var body: some View {
        NavigationView {
            VStack {
                WebView(authListener: self)
            }.navigationBarTitle(Text("PEAKUP Velocity"))
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.