Swift 从完成处理程序更改标签文本

Swift 从完成处理程序更改标签文本,swift,Swift,我有一个带有按钮和标签的示例视图。 当用户按下按钮时,一个操作从外部站点接收一个json,我需要在标签上放一个字符串 我试图从完成处理程序执行此操作,但此时无法识别标签出口 这是我的密码: import UIKit class ViewController: UIViewController, NSURLSessionDelegate { @IBOutlet weak var lblReceivedText: UILabel! var session : NSURLSess

我有一个带有按钮和标签的示例视图。 当用户按下按钮时,一个操作从外部站点接收一个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




}

编译器应该警告您,在引用
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展开。在这一点上,它们具有相同的效果,但如果处理程序在您的视图控制器解除分配后返回,则第二个将使您的应用程序崩溃。

Hi Nate,现在在第一次运行时,println在控制台上显示结果ok(Citacao 0{bookname=Jeremiah;chapter=18;text=“然后上帝对我说,”verse=5;})但在UI标签上没有任何内容。对于后续处理->2015-02-17 18:25:28.919 Biblia[9568:323097]试图在已失效的会话中创建任务2015-02-17 18:25:32.559 Biblia[9568:323097]试图在删除self?后已失效的会话中创建任务。session.finishtasks和invalidate(),我没有更多的错误,但标签仍然是空白的…对不起,没有看过去的第一个问题。您需要回到主线程来更新标签,因为它是UI的一部分。而且,是的,您不需要在那里使会话无效,特别是如果您要重用它。请参阅更新的答案。谢谢!将此代码添加到闭包后运行确定:var backgroundQueue=NSOperationQueue()backgroundQueue.addOperationWithBlock(){NSOperationQueue.mainQueue().addOperationWithBlock(){self!.lblReceivedText.text=Quote}