ios - 在 SwiftUI 中使用 WKWebView 时如何拦截链接导航?
问题描述
我在 SwiftUI 应用程序中使用 WKWebView。我的包中有一个 HTML 文件,我最初将其加载到 WKWebView 中。该文件中有一个链接,如果点击该链接,我想在外部浏览器中打开该链接。我使用以下代码创建了 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)
}
}
我使用以下代码创建了委托:
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)
}
}
}
如果我注释掉创建和分配委托的行,除了在外部打开的链接外,一切正常。编译这些行后,WebView 中不会加载任何内容。我print()
在委托的函数开头放了一条语句,它甚至没有被执行。我在这里做错了什么?
解决方案
很弱,navigationDelegate
所以在提供的代码中,它会在退出时立即释放makeUIView
。
解决方案是将其保留为成员,如
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)
}
}
推荐阅读
- wpf - 使用 Helix Toolkit 的 VS 2015 中的不透明度错误
- sql - 根据 MS Access 中每一列的不同条件更新多列
- react-native - React-native 没有将组件识别为组件
- swift - Swift:选择扩展中定义的类型特定方法实现?
- java - 为什么我会收到“java.lang.RuntimeException:无法启动活动 ComponentInfo”错误?
- node.js - WooCommerce Rest API 创建 Webhooks
- python - 如何在不创建新环境的情况下从一个文件在 conda 中安装多个包?
- python - 无法理解元素交换(python 列表)
- javascript - 如何使用 Puppeteer 暂停并等待用户输入?
- javascript - 如何在站点后将浏览器窗口大小调整为 75%