首页 > 解决方案 > 导航到特定 URL 时关闭 WKWebView

问题描述

我目前正在使用 WKWebView 加载 HTML 文件而不是 URL,并且我正在寻找一种在用户导航到特定 URL 时关闭工作表的方法。

struct WebView: UIViewRepresentable {
  @Binding var text: String
   
  func makeUIView(context: Context) -> WKWebView {
    return WKWebView()
  }
   
  func updateUIView(_ uiView: WKWebView, context: Context) {
    uiView.loadHTMLString(text, baseURL: nil)
  }
}

我正在使用这个 UIViewRepresentable 来加载 HTML 字符串,并且我正在使用这个工作表来显示 WebView:

.sheet(isPresented: $isSheetPresented, onDismiss: {
            self.checkthreed()
        }, content: {
            WebView(text: $decodedString) 
        })

用户可以导航到 2 个 URL:

当用户导航到这些 URL 中的任何一个时,如何关闭工作表?

标签: swiftui

解决方案


这是一个非常基本的非常,您可以根据需要进行调整:

struct WebView: UIViewRepresentable {
    @Binding var text: String
    var closeFunction : (() -> Void)?
   
    class Coordinator : NSObject, WKNavigationDelegate {
        var closeFunction : (() -> Void)?
        
        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if let urlStr = navigationAction.request.url?.absoluteString {
                if urlStr == "test" {
                    closeFunction?()
                }
            }
            decisionHandler(.allow)
        }
    }
    
    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }
    
  func makeUIView(context: Context) -> WKWebView {
    return WKWebView()
  }
   
  func updateUIView(_ uiView: WKWebView, context: Context) {
    uiView.navigationDelegate = context.coordinator
    context.coordinator.closeFunction = closeFunction
    uiView.loadHTMLString(text, baseURL: nil)
  }
}


struct ContentView: View {
    @State var sheetPresented = true
    
    var body: some View {
        Text("Hi")
            .sheet(isPresented: $sheetPresented, content: {
                WebView(text: .constant("<a href=\"test\">Test link</a><br><a href=\"test2\">Test 2</a>"),
                        closeFunction: {
                            sheetPresented = false
                        })
            })
        }
}

WKWebView获得一个附加到它的WKNavigationDelegate位置,它可以接收有关正在加载的 URL 的通知。您可以在我的示例中看到“test”会触发关闭,而“test2”则不会。

WKNavigationDelegate是 a的Coordinator一部分UIViewRepresentable。注意我做了closeFunction一个可选的闭包,所以你必须确保设置它,否则什么都不会发生。另一种方法是传递Binding<Bool>正在呈现的工作表并直接对其进行操作。


推荐阅读