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
。
我正在寻找一种方法来禁止用户使用 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
。