我的应用程序中有一个WKWebView,点击它时WKWebView中有一些按钮,没有加载新页面。从表面上看,他们正试图打开一个about_blank页面。在浏览器中,链接在新页面中打开并加载URL。
答案 0 :(得分:3)
执行此操作的方法是实施BEFORE UPDATE
并覆盖此方法
WKUIDelegate
如果您使用传递的配置返回新的func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?
,请求将被加载到新的webview。由于WKWebView
尝试在浏览器中打开一个新窗口,因此此方法可以补偿iOS中的窗口。您可以使用target=_blank
页面的UIViewController
请求启动新的WKWebView
。
这是一个简单的例子,我用新的webView替换主target=_blank
,并在同一个viewcontroller中加载请求,
WKWebView
这在某种程度上像浏览器中的标签一样工作。但是,请记住,通过上述更改,前向和后向不起作用,因为您已创建新的Webview。如果你想让一切工作,我建议你用这个webview加载一个新的viewcontroller或者创建一个新的视图来加载和显示它,你可以切换到其他主要webview。
答案 1 :(得分:2)
我选择了这种方法,即使这种方法在设备Safari浏览器中打开了URL,无论如何这些链接指向外部链接,这种方法有帮助
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.targetFrame == nil {
if let url = navigationAction.request.url {
let app = UIApplication.shared
if app.canOpenURL(url) {
app.open(url, options: [:], completionHandler: nil)
}
}
}
decisionHandler(.allow)
}
答案 2 :(得分:0)
迅捷解决方案
public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
self.webView.load(navigationAction.request)
}
return nil
}
您需要委托 WKUIDelegate