У меня есть стандартный контроллер разделенного представления с подробным представлением и табличным представлением.Нажатие кнопки в подробном представлении может привести к тому, что объект изменит свое расположение в порядке табличного представления.Это работает нормально, если результирующее изменение порядка не приводит к добавлению или удалению раздела.Т.е. объект может изменить свой порядок в разделе или переключиться с одного раздела на другой.Изменения в заказе работают корректно, без проблем.Но если объект пытается перейти к разделу, который еще не существует, или является последним объектом, покинувшим раздел (следовательно, требующий удаления раздела, по которому он покидает раздел), то происходит сбой приложения.
NSFetchedResultsControllerDelegate имеет методы для обработки добавляемых и удаляемых разделов, которые должны вызываться в этих случаях.Но эти методы делегатов по какой-то причине не вызываются.
Код, о котором идет речь, является стандартным:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
NSLog(@"willChangeContent");
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
NSLog(@"didChangeSection");
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
NSLog(@"didChangeObject");
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;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
NSLog(@"didChangeContent");
[self.tableView endUpdates];
[detailViewController.reminderView update];
}
Запуск приложения и последующий вывод последнего объекта из раздела.приводит к следующему выводу:
2011-01-08 23:40:18.910 Reminders[54647:207] willChangeContent
2011-01-08 23:40:18.912 Reminders[54647:207] didChangeObject
2011-01-08 23:40:18.914 Reminders[54647:207] didChangeContent
2011-01-08 23:40:18.915 Reminders[54647:207] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1145.66/UITableView.m:825
2011-01-08 23:40:18.917 Reminders[54647:207] Serious application error. Exception was caught during Core Data change processing: Invalid update: invalid number of sections. The number of sections contained in the table view after the update (5) must be equal to the number of sections contained in the table view before the update (6), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). with userInfo (null)
Как вы видите, "willChangeContent", "didChangeObject" (перемещение рассматриваемого объекта) и "didChangeContent" были вызваны правильно.Основываясь на документации NSFetchedResultsControllerDelegate от Apple, "didChangeSection" должен был быть вызван до "didChangeObject", что предотвратило бы исключение, вызывающее сбой.
Так что я думаю, вопрос в том, как я могу убедиться, что didChangeSection вызывается?1013 *
Заранее спасибо за любую помощь!