Документов для NSFetchedResultsControllerDelegate предоставить следующий кодЯвляется ли NSFetchedResultsControllerDelegate 'ChangeUpdate' нарушенным?
- (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, он может получить последнее значение «имя» и установить его в TextLabel клетки , Это имя просто не отображается в ячейке, если я не перезагружу его. Даже если я просто щелкнул по ячейке, появится имя. Обратите внимание, что для воссоздания этого поведения вы должны создать новый управляемый объект, а затем дать ему имя, которое заставляет его сортировать FIRST в NSFetchedResultsController. Таким образом, NSFetchedResultsChangeMove не срабатывает (что работает, так как он перезагружает раздел).
Я что-то упустил или это ожидаемое поведение? «Обсуждение» для reloadRowsAtIndexPaths заставляет меня думать, что я должен просто установить текстовую ячейку ячейки без перезагрузки строки, раздела или таблицы.
Это должно быть wo очий. Я делаю то же самое. Для изменения атрибутов при вызове save: выходят уведомления MOC. NSFetchedResultsController видит это изменение и вызывает мой метод configureCell: atIndexPath. Там я захватываю значения и заполняю ячейку, и ячейка обновляется немедленно. Отправьте свой код configureCell. –