Удаление строки таблицы с анимацией с использованием основных данных - PullRequest
1 голос
/ 25 ноября 2010

Если я удаляю строку из моей таблицы, используя стандартную анимацию, например UITableViewRowAnimationFade, код вылетает с этой ошибкой:

*** Завершение приложения из-за необработанного исключения 'NSInternalInconsistencyException', причина: «Неверное обновление: недействительно количество строк в разделе 1. количество строк, содержащихся в существующий раздел после обновления (4) должно быть равно количеству строк содержится в этом разделе до обновление (4), плюс или минус число из строк, вставленных или удаленных из этого раздел (вставлено 0, удалено 1).

Если я удаляю строку анимации, удаление / удаление строки работает, но у меня больше не будет классного перехода Apple на удаление.

Вот мой код - любая помощь приветствуется. Этот метод удаления строк работал до iOS4 , не уверен, что что-то изменилось?

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

    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
        MyItem *myItem = [self.getItemsFetchedResultsController objectAtIndexPath:path];
        [dataRepository deleteItem:myItem];

        // If I comment this line out the delete works but I no longer have the animation
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [self.tableView reloadData];

    }

}

Хранилище данных :

-(void)deleteItem:(MyItem *)myItem {
    [self.managedObjectContext deleteObject:myItem];
    [self saveCurrentContext];
}

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Я решил эту проблему, используя этот код до и после обновления таблицы:

[tableView beginUpdates];
if (editingStyle == UITableViewCellEditingStyleDelete) {
    ... 
}
[tableView endUpdates];
0 голосов
/ 25 ноября 2010

Одной из причин этого может быть, если вы установили NSFetchedResultsControllerDelegate и внедрили controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: Он будет вызван, когда вы сохраните контекст и обновите представление таблицы от вашего имени. Вы могли бы иметь такой код:

case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

Обычно, когда вы получаете сообщение об ошибке, это означает, что вы не обновили источник данных так, как вы указали с помощью deleteRowsAtIndexPaths:withRowAnimation:. Когда вы вызываете этот метод, вы гарантируете, что вы уже обновили источник данных, чтобы отразить это изменение.

...