Как я могу заставить мое табличное представление повторно отобразить данные, когда объекты удалены? - PullRequest
1 голос
/ 25 сентября 2010

У меня есть табличное представление, которое находится в контроллере представления, который наследуется от UITableViewController.

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

Я установил делегат NSFetchedResultsController на self, и я реализовал controllerDidChangeContent в своем контроллере представления.

Я всегда реализовывалфункции делегата табличного представления, включая commitEditingStyle, который вызывается, когда пользователь удаляет строку.

Вот что происходит.Пользователь проводит и удаляет строку, и commitEditingStyle вызывается, как и ожидалось.В этой функции я изменяю свои основные объекты данных таким образом, чтобы они эффективно удалялись из результатов.Другими словами, если вы выполните запрос, который я передал NSFetchedResultsController снова, эта строка больше не будет в наборе результатов.

Одного этого недостаточно, поэтому я добавил вызываемый tableView reloadData в конце commitEditingStyle.Все еще не повезло, поэтому я добавил кнопку обновления, которая вызывает reloadData и это тоже не помогает.Переход к другому контроллеру представления (нажатием кнопки «назад») и возвращение на страницу обычно не работает, но в конечном итоге это выясняется, и строка исчезнет правильно.Конечно, перезапуск программы с нуля всегда работает, но как мне заставить мой tableView корректно обновляться?controllerDidChangeContent никогда не вызывается, кстати.Я думал, что reloadData будет достаточно, но это не так.

1 Ответ

0 голосов
/ 02 марта 2011

Реализовали ли вы контроллер контроллера полученных результатов didChangeObject: делегат метод?

Самый простой способ - создать новый проект с использованием шаблона на основе навигации с основными данными и сравнить RootViewController с вашим кодом. RootViewController уже содержит код для выполнения обновления после модификации табличного представления.

Это примерно так:

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

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the managed object for the given index path
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    [context deleteObject:[self.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();
    }
}

}

Затем используйте этот метод для обновления табличного представления

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

UITableView *tableView = self.tableView;

switch(type) {

    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

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

    case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;

    case NSFetchedResultsChangeMove:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
        break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...