SwiftUI:WKWebView有一个代理来监视URL,并在到达某个点时关闭+在新URL中打开某个链接



我一直在到处寻找解决问题的方法,出于某种原因,我很难找到在SwiftUI中创建WebViews并为其定制/设置委托的好资源。我正在使用第三方API,该API要求我打开WebView,用户登录到某个内容,完成后(信号通过到达某个URL来(,床单应该合上。同时,如果单击某个按钮,将打开一个新的选项卡,但我的WebView正在阻止它,因此不会发生任何操作。这些类型的链接应该在Safari中打开。

我已经定义了一个非常简单的WebView:UIViewRepresentable:

struct WebView: UIViewRepresentable {
var url: URL
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ webView: WKWebView, context: Context) {
let request = URLRequest(url: url)
webView.load(request)
}
}

它被称为这样的(注意这是一个例子(:

Button {
showModal.toggle()
} label: {
Text("**Check ESPN**")
}
.sheet(isPresented: $showModal
, onDismiss: {}
, content: {
WebView(url: URL(string: "https://www.espn.com")!)
}
)

我发现这个StackOverflow问题似乎有我需要在Safari中打开链接的代理,当它试图打开一个新的选项卡时_空白";Safari 中的链接

最重要的是,我需要一个代表来观察URL,当URL包含";完成";,那么片材应该闭合。

我把委托的定义放在哪里?如何将其分配为我的struct WebView的代理人?添加代理后,是否需要在工作表中以其他方式调用WebView?

您需要向WKWebKit实例注册WKNavigationDelegate
Apple开发人员文档

已完成加载回调。请检查实例中的URL。如果加载回调不起作用,请定期检查url。(每隔几秒钟左右(

但是我看到了示例代码中的一些潜在问题

在您的类型中保留WKWebKit实例的引用。如果您只需要关闭,那么将您的类型设置为WKNavigationDelegate

但您可能需要从外部传递代表。SwiftUI必须重建UI,这意味着以某种方式让它知道url是否已到达

在这种情况下,您必须切换到WebView的引用类型。例如,确保你一直在与同一个实例对话,而不是与副本对话

最新更新