NSFetchedResultsController didChangeObject在排序后使用了错误的indexPath

时间:2012-01-18 15:45:59

标签: objective-c uitableview ios5 nsfetchedresultscontroller

我有一个tableView,它使用NSFetchedResultsController来填充viewDidLoad上的表格单元格。用户可以选择使用UISegmentControl(index 0 ='number',index 1 ='name')对tableView进行排序。

当用户单击UISegmentControl时,它会调用函数sortShortListUsingSelectedSortIndex,然后此函数将使用setSortDescriptorsNSFetchedResultsController对tableView重新排序。当表被重新排序并且用户选择一行时,didSelectRowAtIndexPath:正在显示我期望看到的NSIndexPath(例如,IndexPath [0,6]被重新排序到索引[0,3])但是,当尝试删除同一行时,NSIndexPath中的didChangeObject:atIndexPath:forChangeType:newIndexPath显示旧的IndexPath [0,6]而不是[0,3],并会导致崩溃:

  

CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常。更新无效:第0节中的行数无效。更新后的现有部分中包含的行数(9)必须等于更新前该部分中包含的行数(9),加上或减去数字从该部分插入或删除的行(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0移出)。 with userInfo(null)

以下是我的方法的简化版本:Gist

为什么我在tableView中看到同一行的不同索引?

1 个答案:

答案 0 :(得分:0)

此问题的解决方法是确保在尝试重新分配之前正确释放了我的提取控制器。这就是indexPath使用旧索引的原因。

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