0

我正在构建一个具有两个独立 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。(是的,我知道这个委托实际上不会解决我的导航问题,但在解决这个问题之前我什至看不到这个问题。)

4

0 回答 0