Swiftui 导航到特定URL时解除WKWebView

Swiftui 导航到特定URL时解除WKWebView,swiftui,Swiftui,我目前正在使用WKWebView加载HTML文件,而不是URL,并且我正在寻找一种方法,在用户导航到特定URL时关闭该工作表 struct WebView: UIViewRepresentable { @Binding var text: String func makeUIView(context: Context) -> WKWebView { return WKWebView() } func updateUIView(_ uiView: WK

我目前正在使用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中的任何一个时,我如何取消工作表?

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

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
                        })
            })
        }
}
struct-WebView:UIViewRepresentable{
@绑定变量文本:字符串
var closeFunction:(()->Void)?
类协调器:NSObject,WKNavigationDelegate{
var closeFunction:(()->Void)?
func webView(webView:WKWebView,导航操作的决策策略:WKNavigationAction,决策处理程序:@escaping(WKNavigationActionPolicy)->Void){
如果让urlStr=navigationAction.request.url?.absoluteString{
如果urlStr==“测试”{
闭合函数?()
}
}
决策处理程序(.allow)
}
}
func makeCoordinator()->Coordinator{
返回协调员()
}
func makeUIView(上下文:context)->WKWebView{
返回WKWebView()
}
func updateUIView(uiView:WKWebView,context:context){
uiView.navigationDelegate=context.coordinator
context.coordinator.closeFunction=closeFunction
uiView.loadHTMLString(文本,baseURL:nil)
}
}
结构ContentView:View{
@状态变量=真
var body:一些观点{
文本(“Hi”)
.sheet(显示:$sheetPresented,内容:{
WebView(文本:。常量(“
”), 关闭功能:{ 表示为假 }) }) } }
WKWebView
WKNavigationDelegate
附加到它,在那里它可以接收关于加载哪个URL的通知。您可以在我的示例中看到,“test”触发关闭,而“test2”不触发关闭


WKNavigationDelegate
UIViewRepresentable
协调程序的一部分。请注意,我将
closeFunction
设置为可选的闭包,因此您必须确保设置它,否则不会发生任何事情。另一种方法是通过提交的工作表的
绑定
,并直接进行操作。

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