You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:45:04