为什么这不起作用?
dispatch_async(dispatch_get_main_queue(), {
self.timeStringLabel.text = "\(self.timeStringSelected)"
println(self.timeStringLabel.text)
})
我试图在Swift中更新标签,但标签的UI永远不会改变。我一直在谷歌搜索,但我找不到任何不使用dispatch_async的回复。我究竟做错了什么?
第一编辑:我错了。我没有打印更新的文本。文字永远不会改变。如果有帮助,它总是打印出可选(" 0")。故事板中定义的默认值为0。我已经尝试过,有没有dispatch_async但没有成功。我也尝试过添加 self.timeStringLabel.setNeedsDisplay() 更新文本后立即,但这也不起作用。
编辑2:这里是完整的功能+ UILabel声明
@IBOutlet weak var timeNumberLabel: UILabel!
@IBAction func timeNumberButtonPressed(sender: UIButton) {
println("Number Selected. Tag \(sender.tag)")
dispatch_async(dispatch_get_main_queue()) {
self.timeNumberOneButton.selected = false
self.timeNumberTwoButton.selected = false
self.timeNumberThreeButton.selected = false
self.timeNumberFourButton.selected = false
if sender.tag == 0{
self.timeNumberSelected = 0
} else if sender.tag == 1 {
self.timeNumberSelected == 5
} else if sender.tag == 2 {
self.timeNumberSelected == 10
} else {
self.timeNumberSelected == 24
}
sender.selected = true
self.timeNumberLabel.text = "\(self.timeNumberSelected)"
self.timeNumberLabel.setNeedsDisplay()
println(self.timeNumberLabel.text)
}
}
标签清晰可见,如图所示。我并不认为这很难实现,但我错了。我愿意打赌它是一件非常简单的事情,我不知道。
答案 0 :(得分:1)
尝试添加行
self.timeStringLabel.setNeedsDisplay()
(标签更改后)
因为代码是异步运行的,所以接口更新方法可能会错过更改而不会显示它(特别是如果在标签更改之前发生了一段耗时的代码)。添加此代码会强制界面检查并显示可能遗漏的任何更改。
这应该在任何更改界面的异步任务之后使用,因为任务的运行可能与界面方法重叠,导致错过更改。