Swift开发:PKHUD加载Spinner应在WebView哪个事件中隐藏?
嗨,作为iOS新手遇到这个问题很正常,我来帮你捋清楚!
首先,你当前的思路是对的——网页加载完成后再隐藏HUD,但问题大概率出在「WebView的代理没设置」或者「回调方法的签名不对」上,分两种常用的WebView情况给你解决方法:
情况1:你用的是UIWebView(旧版API,现在不推荐但仍有项目在用)
- 先让你的ViewController遵守
UIWebViewDelegate协议:
class YourViewController: UIViewController, UIWebViewDelegate { // 你的现有代码 }
- 在初始化WebView的地方(比如
viewDidLoad)给它设置代理:
// 假设你的WebView变量名叫webView webView.delegate = self
- 修正你的回调方法签名——你现在的写法少了下划线,系统识别不到,正确的写法是:
func webViewDidFinishLoad(_ webView: UIWebView) { HUD.hide() }
情况2:你用的是WKWebView(苹果推荐的新版API)
现在iOS开发基本都用WKWebView了,它的回调逻辑和UIWebView略有不同:
- 让ViewController遵守
WKNavigationDelegate协议:
class YourViewController: UIViewController, WKNavigationDelegate { // 你的现有代码 }
- 给WKWebView设置导航代理:
// 假设你的WKWebView变量名叫wkWebView wkWebView.navigationDelegate = self
- 实现加载完成的回调方法:
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
相关产品推荐
相关产品推荐

