Удалить строку в табличном представлении с помощью fetchedResultController

Во время удаления swype (большинство важных строк этого метода):

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
 if (editingStyle == UITableViewCellEditingStyleDelete)
  {
    Table *deleteRow = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [self.managedObjectContext deleteObject:deleteRow];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
  }   
}

При удалении строки я получаю эту ошибку:

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

Если я прокомментирую последнюю строку кода ( [tableView deleteRowsAtIndexPaths: ...] ), все будет работать нормально (но мне нужно обновить представление, чтобы увидеть, что эта строка была удалена).

Как это сделать правильно ..?

РЕДАКТИРОВАТЬ: Учитывая ответ @Kyr Dunenkoff, я добавил:

- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath*)newIndexPath
{
    UITableView *tableV = [self tableView];
    switch(type) {
        case NSFetchedResultsChangeDelete:
            [tableV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller
{
    [[self tableView] endUpdates];
}

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller
{
    [[self tableView] beginUpdates];
}

Однако это не изменило сбой и ошибку. Atm это просто привело к тому, что добавление новых строк больше не работает.

12
задан Brian Tompsett - 汤莱恩 19 August 2015 в 18:38
поделиться