我使用NSFetchedResultsController
和UITableView
。我有一份"费用清单"保存到CoreData
。这和往常一样。 NSFetchedResultsController
处理所有应有的事情。
每个Expense
实体都有.amount值(Double)。
在桌面视图的顶部,有一个显示totalDebt
的标签。 totalDebt只是每个费用.amount加在一起(可能是正数,负数或零)。
该应用程序允许您添加或删除项目(因此是一个单元格,因此是一个实体)。
我应该如何计算totalDebtLabel
的价值?
我尝试在refreshTotalDebtLabel()
中放置一个cellForRowAtIndexPath
,但每次重新加载表时,计算每个单元格,甚至是已经计算过的单元格。
我尝试了其他解决方案,但它们似乎都失败了。
答案 0 :(得分:2)
这样做的方法是创建一个refreshLabel
方法,以便在数据发生变化时进行调用。您可以通过各种方式捕获它,例如在NSFetchedResultsControllerDelegate
方法中,或文本字段或编辑控制器返回时。
在刷新方法中,利用键值编码(KVC)使其非常简单。
let sum = fetchedResultsController.fetchedObjects.valueForKeyPath("@sum.amount") as! Double
// populate the label with the sum
如果您在托管对象子类中使用原语(例如Double
),则可能必须使用NSNumber
进行重构,这可以保证有效,并且还可以可靠地保留您的Double
值。 (在这种情况下使用...... as! NSNumber
)。
答案 1 :(得分:1)
您无法在表格方法中执行此操作。您必须计算totalDebt
以外的cellForRowAtIndexPath
totalDebt
。例如,在您获取费用数组后,您可以使用循环来计算func refreshTotalDebtLabel()
{
let expenses = NSArray() //fetched from core data
let totalDebt : CGFloat = 0
expenses.enumerateObjectsUsingBlock { (expenseObj, index, stop) -> Void in
totalDebt += expenseObj.amount
}
print("Total Debt = %f", totalDebt)
self.totalDebtLabel.text = String("$ %0.2f", totalDebt)
}
并将其设置在标签中。
FF