如何在闭包内更改 UILabel 的内容

How to change content of UILabel inside of a closure

我无法在闭包内更改 UILabel 的内容。我用谷歌搜索,但找不到解决方案。

这是我的代码的相关部分:

class ViewController: UIViewController {

    @IBOutlet var city: UITextField!
    @IBOutlet var message: UILabel!
    @IBAction func buttonPressed(sender: AnyObject) {

        var urlString = "http://google.com"
        var url = NSURL(string: urlString)


        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url!) {(data, response, error) in

            self.message.text = "try"
            println("done")
        }

        task.resume()
    }
    ... //rest of the code

当我点击按钮时,它应该用 "try" 改变 UILabel 消息的内容。它在控制台中打印出 "done",但不会更改 UILabel 的内容。

您可以在主线程上使用 dispatch_async 来更改它。 UI 更新必须在主线程中完成。 dataTaskWithURL 在后台线程中执行。

let task = session.dataTaskWithURL(url!) {(data, response, error) in

    if (error == nil)
    {
       dispatch_async(dispatch_get_main_queue(),
       {
          self.label.text = "Updated"
       })
    }
}

我刚遇到同样的问题。我已经包裹了 UILabel.text = newTitleDispatchQueue.main.async{} 块中,但没有用。仔细检查后,我发现我不小心在声明 UILabel 的视图控制器之外声明了函数。以为我会写这个以防其他人遇到同样的问题!不要忘记检查您的 indentations:D