シナリオ:
私はiOSアプリケーションを追跡する経費を持っており、「DashBoardViewController」(テーブルビューコントローラー-FRC付き)と呼ばれるビューコントローラーを持っています。これは基本的に、特定の週、月、または年の経費/収入を分類し、セクションヘッダーとして表示しますたとえば、タイトル:(2012年10月1日から10月7日)。特定の週、月、または年に応じて、費用/収入のROWSおよび関連するものが表示されます。
私の質問:
私が達成したいのは:
3つの異なる日付(それぞれ2012年11月11日、11月14日、11月16日)に「自動」という名前の同じカテゴリで3つの新しい経費を節約するとします。
ビューコントローラで、そのカテゴリ「自動」をテーブルビューの行として表示したいのですが、3つの経費を節約したので(カテゴリ「自動」で)、合計金額は3回ではなく、1行としてのみ表示されます。私が節約した3つの費用すべてを合計しました(その特定のカテゴリーについて)。次のスクリーンショットのようなもの。
私は、実際に必要なものではなく、同じカテゴリの3つの行(同じカテゴリの1つの行)を提供するコードビットをいくつか作成しましたが、それらの合計をどのように計算するかわかりませんか?ここでNSPredicateまたはフェッチされた結果コントローラーに関連するものである必要があります。どんな助けでも大歓迎です。
- (void)userDidSelectStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate
{
AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [applicationDelegate managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Money" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
NSPredicate *predicateDate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];
// Edit the sort key as appropriate.
typeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES]; // type refers to an expense or income.
dateSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
if(self.choiceSegmentedControl.selectedIndex == 0) // UISegment Control for "Sorting Category"
{
NSPredicate *predicateCategory = [NSPredicate predicateWithFormat:@"cat == %@", @""];
NSArray * subPredicates = [NSArray arrayWithObjects:predicateCategory, predicateDate, nil];
NSPredicate * compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];
[fetchRequest setPredicate:compoundPredicate];
choiceSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"cat" ascending:NO];
}
NSArray * descriptors = [NSArray arrayWithObjects:typeSortDescriptor, dateSortDescriptor, choiceSortDescriptor, nil];
[fetchRequest setSortDescriptors:descriptors];
[fetchRequest setIncludesSubentities:YES];
if(_fetchedResultsController)
{
[_fetchedResultsController release]; _fetchedResultsController = nil;
}
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"type" cacheName:nil];
_fetchedResultsController.delegate = self;
NSError *anyError = nil;
if(![_fetchedResultsController performFetch:&anyError])
{
NSLog(@"error fetching:%@", anyError);
}
__block double totalAmount = 0;
[[self.fetchedResultsController fetchedObjects] enumerateObjectsUsingBlock: ^void (Money *money, NSUInteger idx, BOOL *stop) {
totalAmount += [[money amount] doubleValue];
}];
[fetchRequest release];
//Finally you tell the tableView to reload it's data, it will then ask your NEW FRC for the new data
[self.dashBoardTblView reloadData];
self.startDate = startDate;
self.endDate = endDate;
}
NSDictionaryResultTypeを使用することを考えましたが、これにより、使用したFRCに問題が発生します(セクション名、テーブルビューの入力など)
FRCをループするコードは、(収入と支出の)合計金額を示しますが、各カテゴリの合計金額が必要です(例:カテゴリ「自動」の合計、カテゴリ「エンターテインメント」の合計)。私を助けてください、私はここで完全に立ち往生しています。