我有一个UIPickerView,我加载了从MySQL数据库下载的数据。数据下载并填充数组,然后我通过委托方法使用该数组作为pickerView的数据源。
我的问题是,一切正常,除了pickerView在数组填满后20秒内没有明显填充。我尝试过运行各种self.view.LayoutIfNeeded()
之类的东西,并且有很多pickerView.reloadAllComponents()
,但它仍然拒绝明显加载。但是,如果用户点击pickerView,或更改它的值(即使它明显为空),数据会突然出现。我已经尝试以编程方式选择每一行来尝试并强制它显示,但这没有奏效。
以下是我下载数据的代码(在viewDidLoad
上运行):
func RetreiveStaff() {
SetProgramMode()
self.aUsers = [User]()
self.pkvUser.reloadAllComponents()
if self.booCurrentDataVersion == true {
var url:NSURL = NSURL(string: "http://www.website.com.au/retrievestaff.php")!
let task:NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in
if error == nil {
let dataArray:[AnyObject] = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! [AnyObject]
for data in dataArray {
let dictionary:[String:String] = data as! [String:String]
if dictionary["StaffID"] != nil {
var newUser:User = User()
newUser.name = dictionary["LastName"]! + ", " + dictionary["FirstName"]!
newUser.id = dictionary["StaffID"]!.toInt()!
self.aUsers.append(newUser)
self.pkvUser.reloadAllComponents()
self.booDownloadedUsers = true
} else {
let actionSheet:UIAlertController = UIAlertController(title: "No Users Downloaded", message: "Please ensure a user has been entered in Access and then restart the app.", preferredStyle: UIAlertControllerStyle.Alert)
let firstAlertAction:UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {
(alertAction:UIAlertAction!) in
})
actionSheet.addAction(firstAlertAction)
self.presentViewController(actionSheet, animated: true, completion: nil)
}
self.pkvUser.reloadAllComponents()
}
println("\(self.aUsers.count) Staff Downloaded")
self.pkvUser.reloadAllComponents()
self.view.setNeedsLayout()
} else {
let actionSheet:UIAlertController = UIAlertController(title: "Connection Error", message: "\(strAppName) was unable to load data. Check you are connected to the internet and restart the app.", preferredStyle: UIAlertControllerStyle.Alert)
let firstAlertAction:UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {
(alertAction:UIAlertAction!) in
})
actionSheet.addAction(firstAlertAction)
self.presentViewController(actionSheet, animated: true, completion: nil)
}
})
task.resume()
}
}
以下是我的pickerView委托方法:
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return self.aUsers[row].name
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if count(self.aUsers) > 0 {
strSelectedUser = self.aUsers[row]
}
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.aUsers.count
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
其中aUsers
是我创建的自定义“用户”对象的数组。
我需要做什么才能让视图刷新/重新加载/显示数据,因为我知道数据存在。我也明白,我是异步下载它,这可能导致这样的问题,但数据几乎立即下载,我不明白为什么视图无法跟上。
提前致谢。
答案 0 :(得分:3)
这可能是因为你总是需要更新主线程中的UI,所以一旦你想要调用import fileinput
for line in fileinput.FileInput("file",inplace=1):
line = line.replace("hello","love")
你需要加载数据(在我想到循环之后)就像下面这样。
reloadAllComponents()