2015-09-19 32 views
0

我使用NSFetchedResultsControllerUITableView。我有一份“费用”清单,保存到CoreData。这和往常一样。 NSFetchedResultsController处理所有事情。如何计算UITableView单元格中的所有值?

每个Expense实体的.amount值(双精度)。

在tableview顶部有一个显示totalDebt的标签。 totalDebt仅仅是每一笔支出加起来的费用(可能是正数,负数或零)。

该应用程序可以让你添加或删除一个项目(所以一个单元格,所以一个实体)。

我该如何计算totalDebtLabel的值?

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

回答

1

你不能在表格方法中做到这一点。您将必须计算cellForRowAtIndexPath以外的totalDebt。例如,在您获取费用数组之后,您可以使用循环来计算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) 
} 
2

要做到这一点的方法是创建一个refreshLabel方法,以便在数据更改时进行调用。您可以通过各种方式来捕捉它,例如在NSFetchedResultsControllerDelegate方法中,或者当文本字段或编辑控制器返回时。

在刷新方法中,利用键值编码(KVC)使其非常简单。

let sum = fetchedResultsController.fetchedObjects.valueForKeyPath("@sum.amount") as! Double 
// populate the label with the sum 

如果你正在使用你的管理对象子类原语(如Double),你可能会与NSNumber这是保证工作,也将可靠地握住你的Double价值重构。 (在这种情况下使用... as! NSNumber)。

相关问题