フェッチされた結果コントローラーの作成でエラーが発生しました。を指定して結果をセクションにグループ化する場合は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 が確実に作成されるようにする必要があります。