如何计算UITableView单元格中的总值?

时间:2015-09-19 07:14:33

标签: swift core-data tableview nsfetchedresultscontroller

我使用NSFetchedResultsControllerUITableView。我有一份"费用清单"保存到CoreData。这和往常一样。 NSFetchedResultsController处理所有应有的事情。

每个Expense实体都有.amount值(Double)。

在桌面视图的顶部,有一个显示totalDebt的标签。 totalDebt只是每个费用.amount加在一起(可能是正数,负数或零)。

该应用程序允许您添加或删除项目(因此是一个单元格,因此是一个实体)。

我应该如何计算totalDebtLabel的价值?

我尝试在refreshTotalDebtLabel()中放置一个cellForRowAtIndexPath,但每次重新加载表时,计算每个单元格,甚至是已经计算过的单元格。 我尝试了其他解决方案,但它们似乎都失败了。

2 个答案:

答案 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