У меня есть довольно vanilla UITableView
, которым управляет NSFetchedResultsController
, для отображения всех экземпляров данного объекта Core Data.
Когда пользователь удаляет запись в виде таблицы, прокручивая ее, tableView:cellForRowAtIndexPath:
в конечном итоге вызывается на мой UITableViewController
с nil
indexPath
. Поскольку я не ожидал, что он будет вызван с помощью nil
indexPath
, приложение выйдет из строя.
Я могу обойти крушение, проверив это значение nil
и вернув пустую ячейку. Кажется, что это работает, но я все еще беспокоюсь о том, что, возможно, я что-то неправильно сделал. Есть идеи? Кто-нибудь когда-либо видел tableView:cellForRowAtIndexPath:
с nil
indexPath
?
Обратите внимание, что это происходит только тогда, когда пользователь удаляет из представления таблицы, прокручивая ячейку. При удалении элемента в режиме редактирования табличного вида этого не происходит. Что было бы между двумя способами удаления ячейки?
Итак, действительно ли ситуация ОК, чтобы получить метод nil
indexPath
в методе делегата табличного представления?
Мой код контроллера просмотра действительно стандартный. Вот удаление:
- (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];
}
Большое спасибо.