フェッチされた結果コントローラーの作成でエラーが発生しました。を指定して結果をセクションにグループ化する場合はsectionNameKeyPath:@"completed"、同じキーを使用して最初のソート記述子を追加する必要があります。
NSSortDescriptor *completeSort = [[NSSortDescriptor alloc] initWithKey:@"completed" ascending:YES];
NSSortDescriptor *daySort = [[NSSortDescriptor alloc] initWithKey:@"dateCreated" ascending:YES];
[dayRequest setSortDescriptors:[NSArray arrayWithObjects:completeSort, daySort, nil]];
もう一つの問題はtableView:cellForRowAtIndexPath:
[self configureCell:cell atIndexPath:indexPath];
[cell formatCell:indexPath.section];
ここでは、セクション 0 には のすべてのアイテムが含まれcompleted = NO、セクション 1 には のすべてのアイテムが含まれていると仮定しcompleted = YESます。ただし、すべての項目が完了している場合は、完了したすべての項目を含む 1 つのセクション (セクション 0) しかありません。indexPath.sectionしたがって、への引数として使用することはできませんformatCell。代わりにの値を使用する必要がありますgoal.completed。たとえば、formatCell呼び出しをconfigureCell:atIndexPath:メソッドに移動できます。
- (void)configureCell:(RegimenCell *)cell atIndexPath:(NSIndexPath *)indexPath {
RegimenGoal *goal = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.label.text = goal.text;
[cell formatCell:goal.completed.intValue];
}
reuseIdentifierそして今、表のセルをセクションと行番号に依存させることはあまり意味がありません。交換するだけでいいと思います
NSString *CellIdentifier = [NSString stringWithFormat:@"%d-%d", indexPath.row, indexPath.section];
固定文字列による
NSString *CellIdentifier = @"YourCellIdentifer";
setNavTitleメソッドにも同様の問題があります。
int goalsCount = [_tableView numberOfRowsInSection:0];
int completedCount = [_tableView numberOfRowsInSection:1];
繰り返しますが、すべての目標が達成された場合、それらはすべてセクション 0 にあり、セクション 1 はありません。その場合、現在のコードでは「(100%)」ではなく「(0%)」が表示されます。
その他の備考:
- 「移動されたオブジェクトが更新されたと報告されることがある」回避策は、ここでは必要ないようです。
NSFetchedResultsChangeUpdateイベントの場合は、 または を呼び出すことができ[self configureCell:...]ます[[_tableView reloadRowsAtIndexPaths:...]。両方を呼び出す必要はありません。
- インスタンス変数は、要求に応じてフェッチ済み結果コントローラー (FRC) を作成するメソッドで
_fetchedResultsControllerのみ使用する必要があります。fetchedResultsController他のすべての場所ではself.fetchedResultsController、必要に応じて FRC が確実に作成されるようにする必要があります。