Подтвердить что ты не робот

Как я могу сделать deleteRowsAtIndexPaths: работать с GenericTableViewController?

Я использую идею Matt Gallagher GenericTableViewController для управления моим UITableViews. Мой источник данных - NSFetchedResultsController.

http://cocoawithlove.com/2008/12/heterogeneous-cells-in.html

Все работает нормально, пока я не попытаюсь удалить ячейку.

В моем контроллере просмотра есть следующий код:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

  if (editingStyle == UITableViewCellEditingStyleDelete) {

        // Delete the managed object.
        NSManagedObjectContext *context = [wineryController managedObjectContext];
        [context deleteObject:[wineryController objectAtIndexPath:indexPath]];

        NSError *error;
        if (![context save:&error]) {
            // Handle the error.
        }
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
  }   
}

Последняя строка выходит из строя с довольно подробным объяснением в консоли:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',  
reason: 'Invalid update: invalid number of rows in section 0.  The number of rows   
contained in an existing section after the update (5) must be equal to the number  
of rows contained in that section before the update (5), plus or minus the number  
of rows inserted or deleted from that section (0 inserted, 1 deleted).'

ОК, я понимаю, что он говорит... строка не удаляется (я бы предположил), потому что я не пересылаю сообщение в нужное место (так как я переместил какой-то код из его "нормального" местоположения)... у кого-нибудь есть идея, какой? Я полностью в тупике.

4b9b3361

Ответ 1

Ну, бах. Я только что нашел этот ответ, который не то же самое, но заставил меня возглавить в правильном направлении. Я оставлю это здесь для всех, кто в будущем будет иметь схожие проблемы.

Ключ состоит в том, чтобы обернуть deleteRowsAtIndexPaths начальным и конечным тегами и заставить модель обновляться в одном блоке, в результате чего:

[tableView beginUpdates];
[self constructTableGroups];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
        withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

Это заставило проблему уйти, а анимации работать просто отлично.