按多个键值排序数据

时间:2015-07-07 19:39:04

标签: ios swift uitableview sorting core-data

我有一个基本列表应用程序,其中有两个实体FolderItem具有多对多关系,文件夹子类有一个名为itemsArray()的函数,它返回项目creationDate的排序数组中显示UITableView

Item有两个名为date的属性NSDate,另一个属于bool,名为completed。我创建了一个函数,我可以将单元格项目对象标记为已完成,将单元格文本颜色更改为灰色。

有没有办法可以按照完成的价值对其进行排序?例如,completed值true或false应该分隔所有已完成的项目,然后按creationDate对其进行排序。

最终结果应该是已完成项目位于UITableView底部且按日期排序的位置以及未完成项目的日期顺序。好像完成的优先级高于日期,但仍然按creationDate命令

使用排序描述符继承当前函数以返回数组;

func itemsArray() -> [Item] {
    let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: true)
    return checklist.sortedArrayUsingDescriptors([sortDescriptor]) as! [Item]
}

PS:我尝试了一些解决方法,例如标记为已完成更新日期,因此它位于底部。这将已完成的项目与未完成的项目分开。但是当将项目取消标记时,它仍然位于底部,这也不是一个好的长期解决方案,因为我可能希望将排序更改为按字母顺序排列并完成。

1 个答案:

答案 0 :(得分:3)

您可以在函数中添加另一个NSSortDescriptor

func itemsArray() -> [Item] {
    let sortByCompleted = NSSortDescriptor(key: "completed", ascending: true)
    let sortByCreationDate = NSSortDescriptor(key: "creationDate", ascending: true)
    return checklist.sortedArrayUsingDescriptors([sortByCompleted, sortByCreationDate]) as! [Item]
}

使用ascending值来先获取true或先false获取func itemsArray() -> [Item] { return checklist.sort { if $0.completed == $1.completed { return $0.creationDate < $1.creationDate } return $0.completed < $1.completed } } 。或者Swifty的做事方式:

DATATABLE 1