ios - UILabel 无法正确更新
问题描述
我是一名初学者,正在使用 Xcode (Swift) 开发 iOS 应用程序。出于某种原因,我可以使用它的属性 .text 在 UILabel 中设置文本,但如果我尝试更新它,标签将只显示我设置的最后一个值 (??)。例如,这是当我单击名为 myButton 的按钮并尝试在名为 Display 的标签中设置文本时执行的代码。结果是仅显示第四个值(“Four”)(在三个 2 秒延迟之后),因为 UILabel 在此之前一直保持空白。真正奇怪的是,如果我删除除第一行(Display.text = "One")以外的所有内容,它会显示得很好。就好像编译器删除了标签的最后一个属性设置以外的所有内容......感谢任何帮助!
@IBAction func myButton(_ sender: Any)
{
Display.text = "One"
sleep(2)
Display.text = "Two"
sleep(2)
Display.text = "Three"
sleep(2)
Display.text = "Four"
}
更新:此代码只是一个示例,演示了我在实际程序中遇到的问题。sleep() 调用仅用于模拟延迟。问题是我似乎无法将 UILabel 的文本设置两次。在我的代码中,我调用了一个需要时间执行的函数,所以我想在标签中显示“等待...”,直到它完成,然后我想在同一个标签中显示结果。但没有运气...
更新 2:我在 Apples 文档中找到了这一点:“您通过将 NSString 对象分配给 text 属性或将 NSAttributedString 对象分配给属性文本属性来为标签提供内容。标签显示这些属性的最新集合。” 最近的?这似乎是我的问题。如何强制它按需更新???
解决方案
不要使用sleep
它阻塞主线程
let arr = ["one","two","three","four"]
var counter = 0
Timer.scheduledTimer(withTimeInterval:2.0, repeats:true) { timer in
self.counter += 1
if counter < self.arr.count {
self.display.text = self.arr[counter]
}
else {
timer.invalidate()
}
}
或使用DispatchQueue.main.asyncAfter
arr.indices.forEach {
DispatchQueue.main.asyncAfter(deadline: .now() + Double( $0 * 2) ) {
self.display.text = self.arr[$0]
}
}
推荐阅读
- bash - mingw32/bin/curl:参数列表太长
- laravel - Lumen 无法验证文件数组
- c# - 将对象转换为类型并使用方法
- java - Java,从文件中获取特定的字符串
- java - 如何为 JPMS 实现 ModuleReader?
- javascript - 角2+ | 如何在 NgModule 中使用参数定义路由
- javascript - Javascript 1同时执行两个函数(onclick事件)
- python - 使用 BeautifulSoup 进行网页抓取:查找标签外的文本
- assembly - 具有“多行参数”的 NASM 宏
- angular - Firebase + Cloud 函数动态 onCall