[英]How do I intercept link navigation when using WKWebView in SwiftUI?
I'm using WKWebView in a SwiftUI app.我在 SwiftUI 应用程序中使用 WKWebView。 I have an HTML file in my bundle that I'm initially loading into the WKWebView.
我的包中有一个 HTML 文件,我最初将其加载到 WKWebView 中。 The file has a link in it that I would like to open in an external browser if tapped.
该文件中有一个链接,如果点击该链接,我想在外部浏览器中打开该链接。 I've created the WKWebView using the following code:
我使用以下代码创建了 WKWebView:
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
typealias UIViewType = WKWebView
let request: URLRequest
func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
let webView = WKWebView()
let delegate = WVNavigationDelegate()
webView.navigationDelegate = delegate
return webView
}
func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {
uiView.load(request)
}
}
I've created the delegate using this code:我使用以下代码创建了委托:
import Foundation
import WebKit
class WVNavigationDelegate: NSObject, WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
switch navigationAction.navigationType {
case WKNavigationType.linkActivated:
UIApplication.shared.open(navigationAction.request.url!, options: [:], completionHandler: nil)
decisionHandler(.cancel)
default:
decisionHandler(.allow)
}
}
}
If I comment out the lines creating and assigning the delegate, everything works fine with the exception of links opening externally.如果我注释掉创建和分配委托的行,除了在外部打开的链接外,一切正常。 With those lines compiled in, nothing loads in the WebView.
编译这些行后,WebView 中不会加载任何内容。 I put a
print()
statement at the beginning of the function in the delegate and it didn't even get executed.我在委托中的 function 的开头放置了一个
print()
语句,它甚至没有被执行。 What am I doing wrong here?我在这里做错了什么?
The navigationDelegate
is weak so in the provided code it is released as soon as exit from makeUIView
. navigationDelegate
很弱,因此在提供的代码中,一旦退出makeUIView
就会释放它。
The solution is to keep it as member, as in解决方案是将其保留为成员,如
struct WebView: UIViewRepresentable {
typealias UIViewType = WKWebView
let request: URLRequest
private let delegate = WVNavigationDelegate() // << here !!
func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
let webView = WKWebView()
webView.navigationDelegate = delegate
return webView
}
func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {
uiView.load(request)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.