swiftui - 导航到特定 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:
- 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
})
})
}
}
WKWebView
获得一个附加到它的WKNavigationDelegate
位置,它可以接收有关正在加载的 URL 的通知。您可以在我的示例中看到“test”会触发关闭,而“test2”则不会。
WKNavigationDelegate
是 a的Coordinator
一部分UIViewRepresentable
。注意我做了closeFunction
一个可选的闭包,所以你必须确保设置它,否则什么都不会发生。另一种方法是传递Binding<Bool>
正在呈现的工作表并直接对其进行操作。
推荐阅读
- spring-mvc - 我在哪里可以找到 Spring MVC 应用程序中的 LDAP 服务器
- reactjs - 当子元素中的元素更新时反应 setState
- java - Spring Boot 找不到 /WEB-INF/classes/index.jsp
- mongodb - 无法连接到mongodb服务
- c# - 在 Unity 中检索序列化的 Playerprefs 特定值
- python - Recursive seek throught python dictionary to create Graphviz
- r - Create a series of timestamps along milliseconds in R
- c# - Linq OrderBy() 与 List.Sort() 的速度
- c - Allocate and free memory in the loop (C + MPI)
- python - 打印字典中最大和第二大的元素