Swiftui 导航到特定URL时解除WKWebView
我目前正在使用WKWebView加载HTML文件,而不是URL,并且我正在寻找一种方法,在用户导航到特定URL时关闭该工作表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
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
时可以看到它是一个命名参数