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

Swift开发:PKHUD加载Spinner应在WebView哪个事件中隐藏?

嗨,作为iOS新手遇到这个问题很正常,我来帮你捋清楚!

首先,你当前的思路是对的——网页加载完成后再隐藏HUD,但问题大概率出在「WebView的代理没设置」或者「回调方法的签名不对」上,分两种常用的WebView情况给你解决方法:

情况1:你用的是UIWebView(旧版API,现在不推荐但仍有项目在用)
  1. 先让你的ViewController遵守UIWebViewDelegate协议:
class YourViewController: UIViewController, UIWebViewDelegate {
    // 你的现有代码
}
  1. 在初始化WebView的地方(比如viewDidLoad)给它设置代理:
// 假设你的WebView变量名叫webView
webView.delegate = self
  1. 修正你的回调方法签名——你现在的写法少了下划线,系统识别不到,正确的写法是:
func webViewDidFinishLoad(_ webView: UIWebView) {
    HUD.hide()
}
情况2:你用的是WKWebView(苹果推荐的新版API)

现在iOS开发基本都用WKWebView了,它的回调逻辑和UIWebView略有不同:

  1. 让ViewController遵守WKNavigationDelegate协议:
class YourViewController: UIViewController, WKNavigationDelegate {
    // 你的现有代码
}
  1. 给WKWebView设置导航代理:
// 假设你的WKWebView变量名叫wkWebView
wkWebView.navigationDelegate = self
  1. 实现加载完成的回调方法:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    HUD.hide()
}
额外小提示:处理多资源加载场景

如果你的网页包含图片、脚本等子资源,上面的回调可能会被触发多次(每加载完一个资源就调用一次)。如果你想等所有资源都加载完成再隐藏HUD,可以加个判断:

// UIWebView版本
func webViewDidFinishLoad(_ webView: UIWebView) {
    if !webView.isLoading {
        HUD.hide()
    }
}

// WKWebView版本
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    if !webView.isLoading {
        HUD.hide()
    }
}

最后再检查下你的代码里有没有其他地方不小心调用了HUD.hide(),这也可能导致Spinner提前消失哦!

内容的提问来源于stack exchange,提问作者Steven Matthews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:50:10