NSFetchedResultsController didChangeObject использует неправильный indexPath после сортировки - PullRequest
0 голосов
/ 18 января 2012

У меня есть tableView, который использует NSFetchedResultsController для заполнения ячеек таблицы на viewDidLoad. Пользователь имеет возможность сортировать tableView с использованием UISegmentControl (индекс 0 = «число», индекс 1 = «имя»).

Когда пользователь щелкает UISegmentControl, он вызывает функцию sortShortListUsingSelectedSortIndex, после чего эта функция переупорядочивает tableView с использованием setSortDescriptors и NSFetchedResultsController. Когда таблица была переупорядочена, и пользователь выбирает строку, didSelectRowAtIndexPath: отображает NSIndexPath, который я ожидаю увидеть (например, IndexPath [0,6] был переупорядочен в Index [0,3]), однако при попытке чтобы удалить эту же строку, NSIndexPath в didChangeObject:atIndexPath:forChangeType:newIndexPath отображает старый IndexPath [0,6], а не [0,3] и приведет к сбою:

CoreData: ошибка: серьезная ошибка приложения. Исключение было получено от делегата NSFetchedResultsController во время вызова -controllerDidChangeContent :. Неверное обновление: недопустимое количество строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (9), должно быть равно количеству строк, содержащихся в этом разделе до обновления (9), плюс или минус число из строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 перемещено). with userInfo (null)

Вот упрощенные версии моих методов: Суть

Почему я вижу разные индексы для одной и той же строки в моем tableView?

1 Ответ

0 голосов
/ 20 января 2012

Исправление для этой проблемы состояло в том, чтобы удостовериться, что мой контроллер выборки был правильно выпущен перед попыткой перераспределения. По этой причине indexPath использовал старый индекс.

[fetchRequestController release];
fetchRequestController = [[NSFetchedResultsController alloc] initWithFetchRequest:shortListRequest
                                                             managedObjectContext:context 
                                                               sectionNameKeyPath:nil 
                                                                        cacheName:nil];
...