Ошибка основных данных при удалении строки в tableView - PullRequest
4 голосов
/ 07 января 2010

У меня есть UITableViewController, управляющий сгруппированным табличным представлением. TableView заполняется из fetchedResultsController.

Если я нажимаю кнопку Редактировать на панели навигации, затем выбираю строку и нажимаю кнопку Удалить , строка удаляется и все заканчивается хорошо.

Однако, если я проведу пальцем, чтобы отобразить кнопку Удалить подряд, и нажму кнопку Удалить, приложение вылетает со следующей ошибкой:

2010-01-06 15: 25: 18.720 Take10 [14415: 20b] Серьезная ошибка приложения. Исключительная ситуация при обработке изменения базовых данных: - [NSCFArray objectAtIndex:]: index (1) за пределами (1) с userInfo (null)

2010-01-06 15: 25: 18.721 Take10 [14415: 20b] Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '*** - [NSCFArray objectAtIndex:]: index (1) за пределами (1) ) '

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

Вот код, в котором я пытаюсь удалить данные из fetchedResultsController. Один и тот же метод отвечает на оба сценария, поэтому я не понимаю, почему происходит сбой при смахивании.

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

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the managed object for the given index path
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
  }   
}

Есть идеи ???

Спасибо

Jk

Ответы [ 2 ]

2 голосов
/ 07 января 2010

Jeff LaMarche проделал хорошую работу с NSFetchedResultsController.

Попробуйте использовать его шаблон здесь: http://iphonedevelopment.blogspot.com/2010/01/navigation-based-core-data-application.html

И посмотрите, решит ли это вашу проблему.

2 голосов
/ 07 января 2010

Одно из различий между обычным и удаленным удалением состоит в том, что последний вызовет tableView:willBeginEditingRowAtIndexPath и tableView:didEndEditingRowAtIndexPath. Фактически, это хороший способ подавить отступ и показать строку вставки.

Другое отличие состоит в том, что setEditing: вызывается (с NO в качестве значения параметра) сразу после удаления.

Установите точки останова в любой из этих трех функций, которые вы определили / переопределили, и посмотрите, сможете ли вы сузить место, где это происходит.

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