Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 如何显示WKWebView url?_Swiftui_Wkwebview_Uiviewrepresentable - Fatal编程技术网

Swiftui 如何显示WKWebView url?

Swiftui 如何显示WKWebView url?,swiftui,wkwebview,uiviewrepresentable,Swiftui,Wkwebview,Uiviewrepresentable,我想知道如何在WKWebView上显示我当前的URL,以及如何在更改时显示URL。目前我添加了一个Text(),但它根本不显示URL。有什么办法可以解决吗 WebView import SwiftUI import WebKit struct WebView : UIViewRepresentable { let request: URLRequest private var webView: WKWebView? init (request: URLReq

我想知道如何在
WKWebView
上显示我当前的URL,以及如何在更改时显示URL。目前我添加了一个
Text()
,但它根本不显示URL。有什么办法可以解决吗

WebView

import SwiftUI
import WebKit

struct WebView : UIViewRepresentable {
    
    let request: URLRequest
    private var webView: WKWebView?

    init (request: URLRequest) {
        self.webView = WKWebView()
        self.request = request
    }
    
    func makeUIView(context: Context) -> WKWebView  {
        webView?.load(request)
        return webView!
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
    
    }

    func URL() -> String {
        return (webView?.url)?.absoluteString ?? ""
    }

    func goBack() {
        webView?.goBack()
    }
    
    func goForward() {
        webView?.goForward()
    }
    
}
主视图

struct MainView: View {
   var webView: WebView = WebView(request: URLRequest(url: URL(string: "https://www.google.com")!))

 var body: some View {
  VStack {
   //...
   Text(webView.URL())
   webView
   Button(action: { webView.goBack() }, label: { Text("Test") })
//...
  }
 }

要跟踪
WKWebView
的URL,您需要使用
WKNavigationDelegate

您可以在您的
UIViewRepresentable
中为
WKNavigationDelegate
使用
协调器
,并使用
@Published
值的
观察对象
WebView
和父视图之间进行通信:

class NavigationState : ObservableObject {
    @Published var url : URL?
}

struct WebView : UIViewRepresentable {
    
    let request: URLRequest
    var navigationState : NavigationState
    
    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }
    
    func makeUIView(context: Context) -> WKWebView  {
        let webView = WKWebView()
        context.coordinator.navigationState = navigationState
        webView.navigationDelegate = context.coordinator
        webView.load(request)
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        
    }

    class Coordinator : NSObject, WKNavigationDelegate {
        var navigationState : NavigationState?
        
        func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
            navigationState?.url = webView.url
        }
    }
    
}

struct ContentView: View {
    @StateObject var navigationState = NavigationState()
    
    var body: some View {
        VStack(){
            Text(navigationState.url?.absoluteString ?? "(none)")
            WebView(request: URLRequest(url: URL(string: "https://www.google.com")!), navigationState: navigationState)
        }
    }
}
根据评论更新:

class NavigationState : NSObject, ObservableObject {
    @Published var url : URL?
    let webView = WKWebView()
}

extension NavigationState : WKNavigationDelegate {
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        self.url = webView.url
    }
}

struct WebView : UIViewRepresentable {
    
    let request: URLRequest
    var navigationState : NavigationState
    
    func makeUIView(context: Context) -> WKWebView  {
        let webView = navigationState.webView
        webView.navigationDelegate = navigationState
        webView.load(request)
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) { }
}

struct ContentView: View {
    @StateObject var navigationState = NavigationState()
    
    var body: some View {
        VStack(){
            Text(navigationState.url?.absoluteString ?? "(none)")
            WebView(request: URLRequest(url: URL(string: "https://www.google.com")!), navigationState: navigationState)
            HStack {
                Button("Back") {
                    navigationState.webView.goBack()
                }
                Button("Forward") {
                    navigationState.webView.goForward()
                }
            }
        }
    }
}

你构建这个问题的方式(与我之前回答的问题相同)可能会影响它的工作方式。您可能想先解决这个问题。@jnpdx我刚才看到了您的答案。我相应地编辑了我的答案。再次感谢你的帮助!唯一的问题是我使用了其他函数,比如goBack goForward。如果我不将webView设置为变量,我不太确定如何调用goBack()函数。我更新了我的帖子,这样你就可以更好地理解了。我只是根据你的新要求更新了我的答案。