Swift中UILabel分步更新文本失效,仅显示最终文本求助
嘿,我来帮你搞定这个加载界面的问题!
问题出在哪?
你用了sleep(5)直接阻塞了主线程——iOS的所有UI更新都依赖主线程的RunLoop来处理,当主线程被sleep卡住的5秒里,系统根本没时间去刷新你的statuslabel文本,所有UI更新请求都会被排队,直到sleep结束后才一次性执行。这就是为什么你看不到中间的"Loading the data",直接跳到了最后的"Connection Success"。
怎么解决?
我们要用异步延迟操作替代sleep,这样主线程不会被卡住,UI更新能及时生效。修改后的代码如下:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(false) // 初始化控件透明度 loadingicon.alpha = 0 statuslabel.alpha = 0 // 执行渐入动画 UIView.animate(withDuration: 0.7) { self.loadingicon.alpha = 1 self.statuslabel.alpha = 1 } // 立即显示加载状态文本 self.statuslabel.text = "Loading the data" // 异步延迟5秒后检查网络,不阻塞主线程 DispatchQueue.main.asyncAfter(deadline: .now() + 5) { if CheckInternet.Connection() { self.statuslabel.text = "Connection Success" } else { self.statuslabel.text = "Connection Failed" // 建议加上失败提示,用户体验更好 } } }
额外的优化小建议
如果你的CheckInternet.Connection()是实际发起网络请求的耗时操作,记得把它放到后台队列执行,避免主线程被意外阻塞,比如:
// 把网络检查放到后台队列 DispatchQueue.global(qos: .utility).async { let isConnected = CheckInternet.Connection() // 回到主线程更新UI(UI操作必须在主线程) DispatchQueue.main.async { if isConnected { self.statuslabel.text = "Connection Success" } else { self.statuslabel.text = "Connection Failed" } } }
另外你代码里重复设置了两次loadingicon.alpha = 0和statuslabel.alpha = 0,删掉重复的就行啦~
内容的提问来源于stack exchange,提问作者Siratee K.
相关产品推荐
相关产品推荐

