Swift更新UILabel,dispatch_async无效

时间:2015-06-01 02:00:21

标签: ios swift uilabel dispatch-async

为什么这不起作用?

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)
    }
}

标签清晰可见,如图所示。我并不认为这很难实现,但我错了。我愿意打赌它是一件非常简单的事情,我不知道。

enter image description here

1 个答案:

答案 0 :(得分:1)

尝试添加行

self.timeStringLabel.setNeedsDisplay()

(标签更改后)

因为代码是异步运行的,所以接口更新方法可能会错过更改而不会显示它(特别是如果在标签更改之前发生了一段耗时的代码)。添加此代码会强制界面检查并显示可能遗漏的任何更改。

这应该在任何更改界面的异步任务之后使用,因为任务的运行可能与界面方法重叠,导致错过更改。

*感谢iOS Development Journal