У меня довольно ванильный 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];
}
Большое спасибо.