排序顺序与显示排序顺序

时间:2017-08-19 20:34:18

标签: ios core-data

我有一个应用程序,显示一个部分标题,后跟详细信息项,然后是下一部分及其详细信息。一切正常,但我想重新排列显示部分的顺序。问题是我需要通过report-id然后状态和日期来订购核心数据,以便在正确的部分下显示正确的详细信息。

let sortDescriptor1 = NSSortDescriptor(key: #keyPath(Item.report.id), ascending:true)
let sortDescriptor2 = NSSortDescriptor(key: #keyPath(Item.report.status), ascending:true)
let sortDescriptor3 = NSSortDescriptor(key: #keyPath(Item.report.dateStarted), ascending:false)
let sortDescriptor4 = NSSortDescriptor(key: #keyPath(Item.date), ascending:true)

如何在保持部分(报告)与其相关的详细信息之间保持正确关系的同时更改排序/显示顺序? report.id是一个UUID,所以目前报告以随机顺序结束。

1 个答案:

答案 0 :(得分:1)

fetchedResultsController有一个属性sectionNameKeyPath,可用于对项目转发器进行分组。这仅适用于sectionNameKeyPath按照排序顺序对项目进行分组的情况。例如:您可以按日期排序,然后按hourweek或任何其他基于时间的分组进行分组,但不能按name进行分组。在您的情况下,您希望按照与项目分组方式不匹配的方式对节进行排序。对于您的特定情况可能会有一些聪明的解决方案,但由于您没有提供任何详细信息,我只能提供一般解决方案。

从fetchedResultsController返回的indexPath对于与tableView或collectionView的互操作性非常有用。但它不一定是一对一的关系。例如,您可以设置一个部分指向一个fetchedResultsController,另一个部分指向另一个部分。执行此设置的关键是确保不要将fetchedResultsController indexPath与collectionView indexPath混淆。通常我发现有一个单独的对象来管理转换indexPath很容易保持它的直接。

创建一个单独的对象,在fetchedResultsController执行提取之后(以及插入或删除节之后)对节进行排序。在indexPathsManager里面有一个字典,地图是" local" indexPath和fetchedResultsController indexPath。确保每次在viewController中使用indexPaths时都要确保使用此对象。还要确保在fetchedResultsController委派更改后更新视图时转换indexPaths。并在插入或删除任何部分时更新indexPathsManager。

TL; DR 在获取后对fetchedResultsController的各个部分进行排序,并将tableView的indexPath转换为fetchedResultsController indexPaths。