2015-01-13 1 views
0

Я не могу изменить содержимое UILabel внутри крышки. Я googled, но решение нигде не найдено.Как изменить содержимое 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 

Это должно изменить содержание UILabel сообщения с «попробовать», когда я нажимаю на кнопку. Он выводит «done» в консоли, но не изменяет содержимое UILabel.

ответ

0

Вы можете изменить его, используя dispatch_async в основной теме. Обновления пользовательского интерфейса должны выполняться в основном потоке. dataTaskWithURL выполняется в фоновом режиме.

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

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

Я изменил его так, как вы предлагали, он работал. После этого я добавил self.message.text = "try" после метода dispatch_async, теперь он тоже работает. Когда я удаляю метод dispatch_async, он не работает. –

+0

Является ли это законным способом решения этой проблемы или это просто обходной путь? В чем основная причина моей проблемы? –

+0

Это способ решить проблему. Это не обходной путь. Вы должны выполнить обновления пользовательского интерфейса в основном потоке. – rakeshbs

Смежные вопросы