【问题标题】:Sorting data by multiple key values按多个键值对数据进行排序
【发布时间】:2015-07-07 19:39:03
【问题描述】:

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

Item 有两个属性称为date,类型为NSDate,另一个属性为bool,称为completed。我创建了一个函数,可以在其中将单元格项目对象标记为已完成,这会将单元格文本颜色更改为灰色。

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

最终结果应该是已完成项目位于UITableView 底部的位置,并且按日期顺序排列,未完成项目按日期顺序排列。好像完成的优先级高于日期,但仍按创建日期排序

这是我当前使用排序描述符返回数组的函数;

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

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

【问题讨论】:

    标签: ios swift uitableview sorting core-data


    【解决方案1】:

    您可以在函数中添加另一个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。或者 Swifty 的做事方式:

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

    【讨论】:

    • 谢谢!我非常感谢这种快速的方式,我是 iOS 新手,并且一直在尝试熟悉闭包。结果实际上分为三个完成组,然后意识到我在添加时从未设置过“false”值,因此在修复您的方法完美运行后,项目实际上具有默认值 nil (Y)
    猜你喜欢
    • 2013-09-14
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多