我有一個UIPickerView,我加載了從MySQL數據庫下載的數據。數據下載並填充數組,然後通過委託方法使用該數組作爲pickerView的數據源。Swift 1.2 - 爲什麼我的UIPickerView不顯示我的數據?
我的問題是,一切工作正常,除了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
是定製的陣列的「用戶'我創建的對象。
我需要做什麼才能使視圖刷新/重新加載/顯示數據,因爲我知道數據在那裏。我也明白,我正在異步下載它,這可能會導致這樣的問題,但數據下載幾乎立即進行,我不明白爲什麼視圖不能跟上。
在此先感謝。
謝謝你的幫助和數據現在瞬間顯示這太棒了!在我加載數據後,我以編程方式在pkv中選擇一行,當我這樣做時,它只顯示它上面的條目(即,如果我想選擇5號中的3號,它將只顯示1,2和3)。你知道這可能是什麼原因嗎? –