在导航到特定URL时忽略WKWebView

  • 本文关键字:WKWebView URL 导航 swiftui
  • 更新时间 :
  • 英文 :


我目前使用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)
}
}

我正在使用这个uiviewrepresable来加载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"触发关闭while "test2"没有。

WKNavigationDelegateUIViewRepresentableCoordinator的一部分。请注意,我将closeFunction设置为可选闭包,因此您必须确保设置它,否则什么都不会发生。另一种方法是传递所呈现的表单的Binding<Bool>并直接操作它。

最新更新