SwiftUI WKWebView 禁用 link 交互

SwiftUI WKWebView disable link interactions

我正在寻找一种方法来禁止用户使用 WKWebView 在 SwiftUI 中与链接和图像进行交互。我尝试了各种方法,但 none 有效,我已经看到并尝试了以下 post 但没有任何效果:

WKWebview allowsLinkPreview to false breaks text selection

我正在显示一个我有权显示的网站,但由于其不正常的 HTML 结构,很难显示上下文,因此我决定尝试禁用用户与链接的交互。我仍然希望启用用户交互,以便用户可以滚动浏览呈现给他们的日历,但不能单击链接。如果您有任何建议,我愿意接受。

这是我的代码:

struct CalanderWeb : UIViewRepresentable {

    @State var request: URLRequest

    func makeUIView(context: Context) -> WKWebView  {

        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.scrollView.isScrollEnabled = true
        uiView.isOpaque = false
        uiView.allowsBackForwardNavigationGestures = false

        uiView.load(request)
    }

    func makeCoordinator() -> CalanderWeb.Coordinator {
        Coordinator(self)
    }


    class Coordinator: NSObject, WKNavigationDelegate {
        let parent: CalanderWeb

        init(_ parent: CalanderWeb) {
            self.parent = parent
        }

        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        }

        func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {

        }

        func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {

        }

        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            decisionHandler(.cancel)
        }
    }

}

谢谢。

您必须覆盖 WKNavigationDelegate 中的方法 decidePolicyForNavigationAction 并在完成块参数 decisionHandler 中提供 .cancel。这是示例代码:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    decisionHandler(.cancel)
}

这是正确的委托回调

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated {
        decisionHandler(.cancel)
    } else {
        decisionHandler(.allow)
    }
}

取决于使用的 HTML,如果需要,也可能会被禁用 .formSubmitted