特定の Core Data エンティティのすべてのインスタンスを表示するために、かなりバニラをUITableView
管理しています。NSFetchedResultsController
ユーザーがスワイプしてテーブル ビューのエントリを削除すると、tableView:cellForRowAtIndexPath:
最終的に myUITableViewController
でnil
indexPath
. で呼び出されるとは思っていなかったのでnil
indexPath
、アプリがクラッシュします。
nil
その値を確認してから空のセルを返すことで、クラッシュを回避できます。これは機能しているように見えますが、何か間違ったことを処理したのではないかと心配しています。何か案は?tableView:cellForRowAtIndexPath:
で呼び出されたのを見た人はいnil
indexPath
ますか?
これは、ユーザーがセルをスワイプしてテーブル ビューから削除した場合にのみ発生することに注意してください。テーブル ビュー編集モードを使用してアイテムを削除する場合、それは起こりません。セルを削除する 2 つの方法の違いは何ですか?
nil
indexPath
では、テーブル ビューのデリゲート メソッドを取得することは本当に問題ないのでしょうか?
私のView Controllerコードは本当に標準的です。削除は次のとおりです。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.moc deleteObject:managedObject];
NSError *error = NULL;
Boolean success = [self.moc save:&error];
if (!success) { <snip> }
// actual row deletion from table view will be handle from Fetched Result Controller delegate
// [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else { <snip> }
}
これにより、NSFetchedResultsController
デリゲート メソッドが呼び出されます。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeInsert: <snip> break;
case NSFetchedResultsChangeUpdate: <snip> break;
case NSFetchedResultsChangeMove: <snip> break;
}
}
もちろん、データ ソース メソッドは によって処理されますNSFetchedResultsController
。たとえば、次のようになります。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
どうもありがとう。