使用WKWebView开发时WKNavigationDelegate方法未被调用如何解决?
问题核心原因
你实现的WKNavigationDelegate代理方法签名不符合Swift官方API规范,系统无法匹配到该方法,因此加载失败时不会触发回调。
具体修改点
- 原代理方法第一个参数缺少外部参数标识
_,导致方法匹配失败 - 错误参数类型应为
Error而非NSError - 冗余的两次加载本地错误页逻辑可以合并,避免重复请求
- 可选添加错误码判断,仅在网络连接失败场景加载自定义错误页,避免其他加载错误时误跳转
修正后完整代码
import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { var webView: WKWebView! override func loadView() { let webConfiguration = WKWebViewConfiguration() webView = WKWebView(frame: .zero, configuration: webConfiguration) webView.uiDelegate = self webView.navigationDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() guard let myURL = URL(string:"https://google.com") else { return } let myRequest = URLRequest(url: myURL) webView.load(myRequest) } // 修正后的代理方法 func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { // 仅判断无网络场景的错误 let nsError = error as NSError guard nsError.code == NSURLErrorNotConnectedToInternet else { return } // 加载本地错误页,注意要确保no_connection.html已经加入项目,且勾选了对应target的成员资格 guard let errorPageUrl = Bundle.main.url(forResource: "no_connection", withExtension: "html") else { return } // allowingReadAccessTo设置为父目录,保证错误页内的本地资源可以正常加载 webView.loadFileURL(errorPageUrl, allowingReadAccessTo: errorPageUrl.deletingLastPathComponent()) } }
注意事项
请确认no_connection.html文件已经添加到你的Xcode项目中,并且在文件的「Target Membership」设置中勾选了对应的应用target,否则读取本地文件时会发生崩溃。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

