在一个闭包中无法向 UILabel 或者 UITextView 传递 text 值

2015-03-18 09:31:43 +08:00
 daiyuechuan
有两个控件
@IBOutlet weak var city: UILabel!
@IBOutlet weak var showWeather: UITextView!

现在的问题是,执行一个无返回值的函数,无法向这两个控件传递text值,而且更糟糕的是,如果向UITextView传值,直接造成程序崩溃。。。求指点


//这个函数调用了一个天气API,返回JSON数据

func returnWeatherInfo(){
var request = HTTPTask()
request.GET("http://m.weather.com.cn/data/101110101.html", parameters: nil, success: {(response: HTTPResponse) in

if let data = response.responseObject as? NSData {
let str = NSString(data: data, encoding: NSUTF8StringEncoding)
println("response: \(str)") //prints the HTML of the page
let json = JSON(data:data)
var citytext = json["weatherinfo"]["city"].string
let date = json["weatherinfo"]["date_y"].string
println("\(citytext!),\(date!)")
self.city.text = "\(citytext)" //这里开始向UILabel传值,不起作用
self.showWeather.text. = "\(date)" //这里向UITextView里传值,造成程序崩溃
}
},failure: {(error: NSError, response: HTTPResponse?) in
println("error: \(error)")

})

}
2207 次点击
所在节点    iDev
4 条回复
keithellis
2015-03-18 09:41:20 +08:00
检查更新 UI 操作是否在主线程进行
ipconfiger
2015-03-18 09:57:31 +08:00
@keithellis 铁定是更新UI没有在主线程

dispatch_async(dispatch_get_main_queue(),{
if let data = response.responseObject as? NSData {
......
});
如此这般即可
dorentus
2015-03-18 10:28:48 +08:00
不起作用应该是没在主线程调用,可以试试这样:

dispatch_async(dispatch_get_main_queue()) {
self.city.text = "\(citytext)"
}

崩溃的话就得看具体是什么错误了,常见的有例如 view 没加载,或者 outlet 没连接,导致 self.showWeather 还是 nil,然后就 EXC_BAD_ACCESS 闪退了
daiyuechuan
2015-03-18 10:50:56 +08:00
@dorentus @ipconfiger @keithellis

非常感谢大家的回复,问题确实是对UI的操作没有跑在主线程,使用了 @ipconfiger 和 @dorentus 代码后均能解决问题。

闪退的问题也找到了,是由于没有对应好optional类型引起的,感谢 @dorentus

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/177661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX