我正在寻找一种方法来禁止用户使用WKWebView与SwiftUI中的链接和图像进行交互。我已经尝试了各种方法,但是都没有成功,并且我已经看到并尝试了以下帖子,但没有任何效果:
WKWebview allowsLinkPreview to false breaks text selection
WKWebview: Disable interaction and clicks on links
我正在显示一个我有权显示的网站,但是由于其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
// Code from srouce 2
let source = """
document.documentElement.style.webkitUserSelect='none';
document.documentElement.style.webkitTouchCallout='none';
var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { elems[i]['href'] = 'javascript:(void)'; }
"""
let userScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let userContentController = WKUserContentController()
userContentController.addUserScript(userScript)
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
uiView.evaluateJavaScript(source, completionHandler: nil)
// End of external code
uiView.load(request)
}
}
谢谢。
您必须在decidePolicyForNavigationAction
中覆盖方法WKNavigationDelegate
,并在完成时提供.cancel
。这是示例代码:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.cancel)
}