Swift 1.2 - 为什么我的UIPickerView不显示我的数据?

时间:2015-07-13 02:22:29

标签: ios mysql asynchronous download uipickerview

我有一个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是我创建的自定义“用户”对象的数组。

我需要做什么才能让视图刷新/重新加载/显示数据,因为我知道数据存在。我也明白,我是异步下载它,这可能导致这样的问题,但数据几乎立即下载,我不明白为什么视图无法跟上。

提前致谢。

1 个答案:

答案 0 :(得分:3)

这可能是因为你总是需要更新主线程中的UI,所以一旦你想要调用import fileinput for line in fileinput.FileInput("file",inplace=1): line = line.replace("hello","love") 你需要加载数据(在我想到循环之后)就像下面这样。

reloadAllComponents()
相关问题