导航到特定 URL 时关闭 WKWebView

Posted

技术标签:

【中文标题】导航到特定 URL 时关闭 WKWebView【英文标题】:Dismissing WKWebView when navigating to a specific URL 【发布时间】:2021-01-30 19:09:00 【问题描述】:

我目前正在使用 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:

example.com/failure example.com/success

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

【问题讨论】:

【参考方案1】:

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

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”则不会。

WKNavigationDelegateUIViewRepresentableCoordinator 的一部分。请注意,我将closeFunction 设置为可选闭包,因此您必须确保设置它,否则不会发生任何事情。另一种方法是传递Binding&lt;Bool&gt; 以获取正在呈现的工作表并直接对其进行操作。

【讨论】:

感谢您的评论!这个解决方案很可能会解决我的问题,但我不知道如何设置closeFunction。我该怎么做? 我在 WebView 上使用它作为尾随闭包,这不是很清楚。我已经更新了我的示例,因此当您在 ContentView 中创建 WebView 时,您可以看到它是一个命名参数

以上是关于导航到特定 URL 时关闭 WKWebView的主要内容,如果未能解决你的问题,请参考以下文章

Flutter web - 根据url设置状态[关闭]

如何使浏览器从 Java 小程序导航到给定的 URL?

如何检测回访者并重定向到特定 URL? [关闭]

如何制作导航抽屉以关闭具有选定项目的组并根据URL打开组

如何在不导航到该 url 的情况下推送历史记录条目并更改地址栏 url?

如何在 onReceive 计时器关闭 SwiftUI iOS 中导航另一个视图