2015-07-13 82 views
0

我有一個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是定製的陣列的「用戶'我創建的對象。

我需要做什麼才能使視圖刷新/重新加載/顯示數據,因爲我知道數據在那裏。我也明白,我正在異步下載它,這可能會導致這樣的問題,但數據下載幾乎立即進行,我不明白爲什麼視圖不能跟上。

在此先感謝。

回答

3

這可能是因爲你總是需要更新主線程中的UI,所以一旦你加載了數據(在我認爲循環之後),當你想調用reloadAllComponents()時,你必須像下面這樣做。

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 

dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    dispatch_async(dispatch_get_main_queue()) { 
     self.pkvUser.reloadAllComponents() 
    } 
} 
+0

謝謝你的幫助和數據現在瞬間顯示這太棒了!在我加載數據後,我以編程方式在pkv中選擇一行,當我這樣做時,它只顯示它上面的條目(即,如果我想選擇5號中的3號,它將只顯示1,2和3)。你知道這可能是什麼原因嗎? –