ios - UILabel 无法正确更新

标签 ios swift xcode uilabel

我是一名初学者,正在 Xcode (Swift) 中开发 iOS 应用程序。出于某种原因,我可以使用 UILabel 的属性 .text 设置文本,但如果我尝试更新它,标签将只显示我设置的最后一个值(??)。例如,以下是当我单击名为 myButton 的按钮并尝试在名为 Display 的标签中设置文本时执行的代码。结果是仅显示第四个值(“四”)(在三个 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:我在 Apple 文档中找到了这一点:“您可以通过将 NSString 对象分配给 text 属性或将 NSAttributedString 对象分配给 attributeText 属性来提供标签的内容。标签 显示最近的内容这些属性的集合。”最近的?这似乎是我的问题。我怎样才能强制它按需更新???

最佳答案

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

关于ios - UILabel 无法正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503456/

相关文章:

swift - 时间戳事件匹配错误: Failed to find matching element

ios - 如何导航回上一个 View

php - iOS 9.1 导致我的 JSON NSURL 连接到 PHP 页面时出现错误

ios - 观察 Object Swift 4 的变化

ios - 越狱 - 重新定位 Core Data 应用程序的 "Documents"目录

ios - 如何使用 swift 创建一个圆形选项卡?

ios - NSFetchedResultsController 出现核心数据删除错误

iphone - 无法解密通过 iPhone 上的 OpenSSL 编码的数据

python - Python 中的 SSLSocket 口令/密码

iphone - UITableView 奇怪的行为