2

ユーザーがブックマークしたアイテムを表示する NSFetchedResultsController に裏打ちされた UITableView があります。行内のボタンからアイテムのブックマークを解除でき、問題が発生します。アイテムのブックマークを解除すると、述語と一致しなくなるため、テーブル ビューから消えるはずですが、セクションごとの行数が更新によって変更されたため、次のエラーのバリエーションが表示されます。

CoreData: エラー: 重大なアプリケーション エラーです。-controllerDidChangeContent: の呼び出し中にデリゲート NSFetchedResultsController から例外がキャッチされました。無効な更新: セクション 0 の行数が無効です。更新後の既存のセクションに含まれる行数 (3) は、更新前にそのセクションに含まれる行数 (4) にプラスまたはマイナスの数値を指定する必要があります。そのセクションに挿入または削除された行数 (0 挿入、0 削除)、およびそのセクションに移動された、またはそのセクションから移動された行数 (0 移動、0 移動)。userInfo (ヌル)

これが私の非常に単純な didChangeObject メソッドです。

-(void)controller:(NSFetchedResultsController *)controller
  didChangeObject:(id)anObject
     atIndexPath:(NSIndexPath *)indexPath
   forChangeType:(NSFetchedResultsChangeType)type
    newIndexPath:(NSIndexPath *)newIndexPath
{

[super controller:controller didChangeObject:anObject atIndexPath:indexPath forChangeType:type newIndexPath:newIndexPath];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

}

NSFetchedResultsController に不一致のカウントを気にしないように指示できる方法はありますか? それとも、まったく別のアプローチが必要ですか?

4

2 に答える 2

2

Martin R は良い答えを出しましたが、重要なことを 1 つ省略しています。

FetchControllerProtocol が同時に多数の行を更新しようとすると、クラッシュする可能性があります。

Apple Docは、プロセスの非常に明確な典型的な例を示しています。テーブルの変更を beginUpdates および endUpdates メソッドで囲むことが重要です。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}

セクションがある場合は、セクションの更新も実装する必要があります

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
    atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                            withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

お役に立てれば

于 2015-05-07T09:37:59.020 に答える