ios - 按多个键值对数据进行排序

标签 ios swift uitableview sorting core-data

我有一个包含两个实体的基本列表应用 FolderItem对于多对多关系,文件夹子类有一个名为 itemsArray() 的函数它返回按 creationDate 排序的数组中的 Items显示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:我尝试了一些变通方法,例如将日期标记为已完成更新使其位于底部。这将已完成的项目与未完成的项目分开。但是,当取消标记该项目时,它仍保留在底部,这也不是一个好的长期解决方案,因为我可能想将排序更改为按字母顺序和完成。

最佳答案

您可以将另一个 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 值以首先获得 truefalse。或者 Swifty 的做事方式:

func itemsArray() -> [Item] {
    return checklist.sort {
        if $0.completed == $1.completed {
            return $0.creationDate < $1.creationDate
        }
        return $0.completed < $1.completed
    }
}

关于ios - 按多个键值对数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31277844/

相关文章:

ios - 如何让前导空间成为 SuperView 宽度的 1/3

ios - 为 Debug-iphoneos 构建时如何调试断言

ios - UISegmentedControl TableView 重新排序

ios - TableView 索引被剪裁在底部

iphone - 点击 MapKit 注释时应用程序崩溃

ios - 更新 SQLite 架构 iOS

swift - 为什么 String.append 不适用于像 "foo\(bar)"这样的格式化字符串?

iphone - 以编程方式添加 UITableView - 如何设置单元格的重用标识符?

当最终版本上线时,iOS 使应用程序的测试版无效

ios - Swift UIImage 命名返回 nil 并在 Assets 中使用通用图像