首页 > 解决方案 > 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 对象分配给属性文本属性来为标签提供内容。标签显示这些属性的最新集合。” 最近的?这似乎是我的问题。如何强制它按需更新???

标签: iosswiftxcodeuilabel

解决方案


不要使用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]
   }
}

推荐阅读