【问题标题】:NSFetchedResultsController didChangeObject is using wrong indexPath after sortingNSFetchedResultsController didChangeObject 在排序后使用了错误的 indexPath
【发布时间】:2012-01-18 15:45:58
【问题描述】:

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

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

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

这是我的方法的简化版本:Gist

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

【问题讨论】:

    标签: objective-c uitableview ios5 nsfetchedresultscontroller


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多