У меня есть немного проблемы с моим UITableViewController или NSFetchedResultsController. Я не уверен, который является проблемой Соре, но я предполагаю, что это - UITableViewController.
Как я сказал, я использую NSFetchedResultsController для заполнения моих данных в UITableViewController. Данные отсортированы по дате и также отображены в разделах к году даты, например, маю 2010/июней 2010/и так далее. Это отображено как заголовок раздела.
Теперь, когда я добавляю новые данные, они автоматически используют текущую дату в качестве значения по умолчанию, но если я хочу использовать дату, которая в настоящее время находится не в списке раздела, например, апрель 2010 (в настоящее время май и июнь в списке), затем это не отображено правильно. Только, когда я вышел из приложения и запускаю его снова, оно покажет новые заголовки раздела, и все прекрасно.
Таким образом, я так или иначе должен смочь обновить свой список или обновить его. Просто добавив его к контексту и изменившись он, кажется, не обновляет его.
Снова, я не уверен, что я должен обновить, если это - мой объект NSFetchedResultsController или UITableViewController.
ОБНОВЛЕНИЕ № 1:
Я просто полагал, что существует исключение в этом методе:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
Это - то, куда я перемещаю данные:
- (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];
// Reloading the section inserts a new row and ensures that titles are updated appropriately.
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Этот метод в значительной степени взят от примера CoreDataBooks от Apple. И это - ошибка:
Серьезная ошибка приложения. Исключение было поймано от делегата NSFetchedResultsController во время вызова к-controllerDidChangeContent:. *** - [NSMutableArray removeObjectAtIndex:]: индекс 1 вне границ [0.. 0] с userInfo (пустой указатель)
И после этого, режим редактирования (где удалить кнопка появляется) больше не работает.
Спасибо.
Хорошо, похоже, я нашел решение, я просто пропускаю эти
[self.tableView beginUpdates];
[self.tableView endUpdates];
и всегда делаю вот так.
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView reloadData];
}
Очевидно, я еще немного поработаю над логикой, поскольку проблема возникает только тогда, когда я хочу переместить данные в раздел, которого раньше не существовало. Пока кто-нибудь не предложит мне реальное решение, я буду использовать этот вариант.
Вам необходимо реализовать методы делегата controller:didChangeSection:atIndex:forChangeType:
. В нем отправьте insertSections:withRowAnimation:
, deleteSections:withRowAnimation:
и reloadSections:withRowAnimation:
сообщения вашему табличному представлению в зависимости от сообщенного типа изменения.