ios - 排序顺序与显示排序顺序

标签 ios core-data

我有一个应用程序显示一个部分标题,然后是详细信息项,然后是下一个部分及其详细信息。一切正常,但我想重新排列各部分的显示顺序。问题是我需要按报告 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,因此目前报告以随机顺序结束。

最佳答案

一个 fetchedResultsController 有一个属性 sectionNameKeyPath 可以用来将项目组合在一起。这仅在 sectionNameKeyPath 以与排序相同的顺序对项目进行分组时才有效。例如:您可以按日期排序,然后按小时 或任何其他基于时间的分组进行分组,但不能按名称。在您的情况下,您希望这些部分的排序方式与项目的分组方式不匹配。对于您的特定情况可能有一些聪明的解决方案,但由于您没有提供任何细节,我只能给出一个通用的解决方案。

从 fetchedResultsController 返回的 indexPath 对于与 tableView 或 collectionView 的互操作性非常有用。但它不一定是一对一的关系。例如,您可以进行这样的设置,其中一个部分指向一个 fetchedResultsController,而另一部分指向另一个。进行此设置的关键是确保不要将 fetchedResultsController 的索引路径与您的 collectionView 的索引路径混淆。一般来说,我发现有一个单独的对象来管理转换indexPath,这是保持其正常的简单方法。

创建一个单独的对象,在 fetchedResultsController 执行提取后(以及插入或删除部分后)对部分进行排序。在 indexPathsManager 内部有一个字典,用于“本地”indexPath 和 fetchedResultsController indexPath 之间的映射。确保每次在 viewController 中使用 indexPaths 时都使用此对象。另外,请确保在 fetchedResultsController 委托(delegate)发生更改后更新 View 时转换 indexPaths。并在插入或删除任何部分时更新indexPathsManager。

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

关于ios - 排序顺序与显示排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45776038/

相关文章:

ios - 一个 TableView 中的多个 NSFetchedResultsController

ios - 魔法记录核心数据错误

ios - 无法与 IB 中的约束建立导出连接

ios - CALayer 圆形蒙版动画不正确的行为 + Swift

ios - 自定义 UIView 子类添加 nib subview

swift - 在应用程序启动时自动恢复上次保存的文档

ios - 使用 NSDateFormatter 显示日期

ios - iOS 是否支持 WAV 文件?

ios - 敏感信息应该存储在哪里?

iphone - Core Data性能deleteObject并保存托管对象上下文