我使用从HealthKit
检索数据的应用程序,然后将它们存储在数组中。我尝试做的是将tableViewController
加载到该数组中的数据。但不幸的是,当我运行该应用程序时,该表显示为空。
为了更清楚,我有一个方法可以编码来检索所需数据的列表,如果用这些提取的数据填充一个数组(在类的顶部声明)。
我所做的是我在viewDidLoad
函数中调用了这个函数,然后打印出数组但它是空的,所以我将方法的调用移到了函数viewDidAppear
并打印出来数组。数组成功填充了数据,但我仍然遇到动态用这个数组的数据填充行的问题。它仍然显得空白。我理解的问题是在数组填充数据之前正在加载表视图。我通过调用方法self.tableView.reloadData()
尝试了另一种解决方案,但没有运气。
有谁能请我解决这个问题?
更新:
以下是viewDidLoad
功能:
override func viewDidLoad() {
super.viewDidLoad()
authorizeHealthKit()
updateLastGlucoRecords()
println("\(glucoReadings)")
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
这是viewDidAppear
函数:
override func viewDidAppear(animated: Bool) {
updateLastGlucoRecords()
println("Hereeeee2: \(glucoReadings)")
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
以下是数据动态加载表的位置:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
let df = NSDateFormatter()
let tf = NSDateFormatter()
df.dateFormat = "yyyy-MM-dd"
tf.dateFormat = "hh:mm:ss"
let readingDateTime = dates[indexPath.row]
let dateTabel = cell.viewWithTag(100) as! UILabel!
let timeLabel = cell.viewWithTag(101) as! UILabel!
let readingLabel = cell.viewWithTag(102) as! UILabel!
let indicator = cell.viewWithTag(103) as UIView!
dateTabel.text = df.stringFromDate(readingDateTime)
timeLabel.text = tf.stringFromDate(readingDateTime)
let reading = readings[indexPath.row]
let doubleReading = getRecordDouble(reading)
readingLabel.text = reading
let sCase = recordCase(doubleReading!)
switch (sCase) {
case "Very low": indicator.backgroundColor = UIColor.redColor()
case "Too low": indicator.backgroundColor = UIColor.orangeColor()
case "Normal": indicator.backgroundColor = UIColor.greenColor()
case "Too high": indicator.backgroundColor = UIColor.yellowColor()
case "Very High": indicator.backgroundColor = UIColor.orangeColor()
case "Danger": indicator.backgroundColor = UIColor.redColor()
default: indicator.backgroundColor = UIColor.grayColor()
}
return cell
}
最后,这是从HealthKit
检索数据的方法:
func updateLastGlucoRecords()
{
// 1. Construct an HKSampleType for weight
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodGlucose)
// 2. Call the method to read the most recent weight sample
self.healthManager.readRecent10GlucoseReadings(sampleType, completion: {(allReadings, error) -> Void in
println()
if (error != nil) {
println("Error reading glucose readings from HealthKit Store: \(error.localizedDescription)")
return;
}
var glucoseLocalizedString = self.kUnknownString;
self.glucoses = allReadings as? [HKQuantitySample]
for reading in self.glucoses! {
if let record = reading.quantity {
glucoseLocalizedString = "\(record)"
let dateTimeRecorded = reading.startDate
self.glucoReadings.append(glucoseLocalizedString)
self.glucoDates.append(dateTimeRecorded)
println("Reading: \(self.glucoReadings), Date: \(self.glucoDates)")
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
})
}
})
}
答案 0 :(得分:2)
据推测,您在HealthKit中使用的查询包含完成处理程序。查询完成时调用此处理程序,这是您应该调用reloadData的地方。
由于HealthKit调用是异步的,因此您不能依赖于viewWillAppear
或viewDidLoad
中填充的数组。
答案 1 :(得分:1)
尝试在填充数组后在主线程中调用self.tableView.reloadData()
:
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
不要忘记确保您的datasource
方法得到正确实施。