Как я могу сделать deleteRowsAtIndexPaths: работать с GenericTableViewController? - PullRequest
21 голосов
/ 19 июня 2009

Я использую идею Мэтта Галлахера 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).'

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

1 Ответ

67 голосов
/ 19 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...