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