我正在构建一个具有两个独立 Web 视图的应用程序。当您在滚动视图中单击文章列表时,相应的网页会加载到第一个视图中。我正在尝试获取它,以便当我单击该视图中的链接时,它会将该链接加载到第二个中。
这就是我用来创建 Web 视图的方法:
struct LogWebView: UIViewRepresentable {
typealias UIViewType = WKWebView
@ObservedObject var theLibraryComputer = ALibraryComputer.shared
let url: URL?
private let delegate = WVNavigationDelegate()
func makeUIView(context: Context) -> WKWebView {
let prefs = WKWebpagePreferences()
prefs.allowsContentJavaScript = true
let config = WKWebViewConfiguration()
config.defaultWebpagePreferences = prefs
let webView = WKWebView()
return webView
}
func updateUIView(_ uiView: WKWebView, context: Context) {
guard let myURL = url else {
return
}
let request = URLRequest(url: myURL)
uiView.load(request)
}
}
现在,第一个 Web 视图由存储在可观察对象中的变量驱动。当用户单击链接时,该变量被设置,并且 Web 视图加载得很好。为了解决“加载到第二个视图”问题,我认为可以使用委托来拦截链接操作。我正在使用这个代表:
class WVNavigationDelegate: NSObject, WKNavigationDelegate {
@ObservedObject var theLibraryComputer = ALibraryComputer.shared
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 时,事情就中断了:
func makeUIView(context: Context) -> WKWebView {
let prefs = WKWebpagePreferences()
prefs.allowsContentJavaScript = true
let config = WKWebViewConfiguration()
config.defaultWebpagePreferences = prefs
let webView = WKWebView()
webView.navigationDelegate = delegate
return webView
}
现在,当我单击滚动列表中的链接时,不再加载 webview。(是的,我知道这个委托实际上不会解决我的导航问题,但在解决这个问题之前我什至看不到这个问题。)