2015-09-19 68 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)。

相關問題