我有这个网络视图:
import SwiftUI
import WebKit
struct ContentView: View {
var body: some View {
Webview(url: URL(string: "https://google.com")!)
}
}
struct Webview: UIViewRepresentable {
let url: URL
func makeUIView(context: UIViewRepresentableContext<Webview>) -> WKWebView {
let webview = WKWebView()
let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
webview.load(request)
return webview
}
func updateUIView(_ webview: WKWebView, context: UIViewRepresentableContext<Webview>) {
let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
webview.load(request)
}
}
当有人单击链接时,我该如何拦截?除了有人单击链接时转到URL之外,我还想做其他事情。我已经阅读了代表的内容,但它们只适用于较早的版本。
答案 0 :(得分:0)
您可以实现一个Coordinator对象,并将其设置为WKNavigationDelegate。然后,您可以实现definePolicyFor navigationAction方法并确定对每个请求执行的操作:
import SwiftUI
import WebKit
struct ContentView: View {
var body: some View {
WebView(request: .init(url: URL(string: "https://google.com")!))
}
}
struct WebView: UIViewRepresentable {
let request: URLRequest
func makeCoordinator() -> Coordinator { .init(self) }
func makeUIView(context: Context) -> WKWebView {
let webView = WKWebView()
webView.navigationDelegate = context.coordinator
return webView
}
func updateUIView(_ webView: WKWebView, context: Context) {
webView.load(request)
}
class Coordinator: NSObject, WKNavigationDelegate {
var webView: WebView
init(_ webView: WebView) { self.webView = webView }
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
if let url = navigationAction.request.url,
let host = url.host, !host.hasPrefix("www.google.com"),
UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
print(url)
print("Redirected to browser. No need to open it locally")
decisionHandler(.cancel)
} else {
print("Open it locally")
decisionHandler(.allow)
}
} else {
print("not a user click")
decisionHandler(.allow)
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}