Документы для NSFetchedResultsControllerDelegate предоставляют следующий пример кода
- (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 reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Когда я создаю новый NSManagedObject, NSFetchedResultsChangeInsert срабатывает (отлично!). Когда я изменяю значение атрибута (используется для заголовка ячейки), NSFetchedResultsChangeUpdate срабатывает. К сожалению, новый заголовок не отображается автоматически, если я не перезагружу таблицу, раздел или строку. Действительно, если новое имя приводит к тому, что результирующий набор сортируется по-другому, то NSFetchedResultsChangeMove срабатывает, и все в порядке, поскольку предоставленный код перезагружает весь раздел.
UITableView имеет метод reloadRowsAtIndexPaths: withRowAnimation , поэтому я попытался использовать его в NSFetchedResultsChangeUpdate кодовом блоке. Это действительно работает ... но документы для этого конкретного метода читаются так, как будто мне это не нужно (обратите внимание на последнюю строку):
Перезагрузка строки вызывает
табличное представление, чтобы спросить его источник данных для
новая ячейка для этого ряда. Стол
оживляет эту новую клетку, как это
оживляет старый ряд. Позвони
метод, если вы хотите предупредить пользователя
что значение ячейки меняется.
Если, однако, уведомление пользователя не
важно, то есть вы просто хотите
изменить значение, которое ячейка
отображение - вы можете получить ячейку для
конкретной строки и установите ее новое значение.
И да, если я запишу, что происходит, когда
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
вызывается для NSFetchedResultsChangeUpdate , он может извлечь последнее значение 'name' и установить его в textLabel ячейки. Имя просто не отображается в ячейке, пока я не перезагружу его. Даже если я просто нажму на ячейку, появится имя. Обратите внимание, что для воссоздания этого поведения вы должны создать новый управляемый объект, а затем дать ему имя, которое заставляет его сортировать FIRST в NSFetchedResultsController. Таким образом, NSFetchedResultsChangeMove не запускается (что работает, поскольку он перезагружает раздел).
Я что-то упустил или это ожидаемое поведение? «Обсуждение» reloadRowsAtIndexPaths заставляет меня поверить, что я должен иметь возможность просто установить textLabel ячейки без перезагрузки строки, раздела или таблицы.