2015-02-17 35 views
1

我有一個帶有按鈕和標籤的示例視圖。 當用戶按下按鈕的動作從外部網站接收JSON,我需要把一個字符串放在標籤。從完成處理程序中更改標籤文本

我試圖從完成處理程序執行此操作,但此時標籤插座無法識別。

這裏是我的代碼:

import UIKit 

class ViewController: UIViewController, NSURLSessionDelegate { 

    @IBOutlet weak var lblReceivedText: UILabel! 

    var session : NSURLSession! 


    required init(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
     configuration.timeoutIntervalForRequest = 15.0 

     session = NSURLSession(configuration : configuration, delegate : self, delegateQueue : nil) 

    } 


    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

    } 


    @IBAction func btnGerarMensagem(sender: AnyObject) 

    { 

     var errorx : NSError? 
     let url = NSURL(string: "http://labs.bible.org/api/?passage=random&type=json") 

     let task = session.dataTaskWithURL(url! , 
      completionHandler: { [weak self] (data: NSData!, 
       response : NSURLResponse! , 
       error : NSError!) in 

       var error: NSError? 
       var array = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as NSArray 
       var citacao: NSDictionary = array.objectAtIndex(0) as NSDictionary 

       var Quote = citacao["text"] as String 
       lblReceivedText.text = Quote     
       self!.session.finishTasksAndInvalidate() 


     }) 

     task.resume() 

    } // IBAction 




} 

回答

1

編譯器應該給你,你需要引用您的UILabel財產時使用self警告。試試這個:

let task = session.dataTaskWithURL(url! , 
    completionHandler: { [weak self] (data: NSData!, 
     response : NSURLResponse! , 
     error : NSError!) in 

     var error: NSError? 
     var array = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as NSArray 
     var citacao: NSDictionary = array.objectAtIndex(0) as NSDictionary 

     var Quote = citacao["text"] as String 
     NSOperationQueue.mainQueue().addOperationWithBlock { 
      self?.lblReceivedText.text = Quote 
     } 
}) 

注:如果你在一個封閉宣佈[weak self],拆開包裝與self?而不是self!。在這一點上,它們具有相同的效果,但是如果處理程序在您的視圖控制器被釋放後回來,第二個將會崩潰您的應用程序。

+0

內特嗨,現在是第一次運行時的println顯示的結果爲控制檯Citacao 0 OK({ BOOKNAME =耶利米 章= 18; 文本=「耶和華對我說,」 詩句= 5; } ),但在UI標籤上沒有任何內容。對於後續處理 - > 2015-02-17 18:25:28.919 Biblia [9568:323097]嘗試在已失效的會話中創建任務 2015-02-17 18:25:32.559 Biblia [9568:323097]嘗試在已失效的會話中創建一個任務 – GCoe 2015-02-17 20:30:08

+0

刪除self?.session.finishTasksAndInvalidate()後,我沒有更多的錯誤,但標籤保持空白... – GCoe 2015-02-17 20:40:31

+0

對不起,沒有看過第一個問題。您需要回到主線程來更新標籤,因爲它是UI的一部分。而且,是的,你不需要在那裏使會話失效,特別是如果你要重用它。查看更新的答案。 – 2015-02-17 20:42:30