通过 NSDate 对元素进行排序并添加到 UITableView

Posted

技术标签:

【中文标题】通过 NSDate 对元素进行排序并添加到 UITableView【英文标题】:Sort Elements via NSDate and add to UITableView 【发布时间】:2015-05-02 18:44:33 【问题描述】:

在我开始提问之前,我想补充一点 - 我不是要代码。我现在想明确说明这一点,因为有些人可能会理解这个问题作为对代码的请求。我正在寻求有关如何实现这一目标的想法,我不希望其他人为我这样做。

最近,我开始涉足 Core Data,我遇到了一个独特的问题,我需要解决一些重大问题。我有一些对象是NSManagedObject 的子类,它们具有三个属性,其中一个与这种情况相关 - dueDate,它的类型为NSDate。 我一直在努力寻找一种方法来对子类对象进行排序,然后将其添加到UITableView 中的五个不同部分之一,其中包括:

    今天 明天 一周 一个月 超过一个月

使用此功能对元素进行排序:

func fetchAssignments() 
    let appDelegate =
    UIApplication.sharedApplication().delegate as! AppDelegate

    let managedContext = appDelegate.managedObjectContext!

    let fetchRequest = NSFetchRequest(entityName:"Assignment")

    var error: NSError?

    let fetchedResults =
    managedContext.executeFetchRequest(fetchRequest,
        error: &error) as! [NSManagedObject]?

    if let results = fetchedResults 
        let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let todayDate = calendar.startOfDayForDate(NSDate())

        for item in results 
            let dueDate = item.valueForKey("dueDate") as! NSDate
            println(dueDate)
            let calendarComponents = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay,
                fromDate: todayDate, toDate: dueDate, options: nil)

            println("Months: " + calendarComponents.month.description)
            println("Days: " + calendarComponents.day.description)

            if calendarComponents.month >= 2 || (calendarComponents.month == 1 && calendarComponents.day > 0) 
                println("Greater")
             else if calendarComponents.month == 1 || calendarComponents.day > 7 
                println("One Month")
             else if calendarComponents.day > 1 
                println("One Week")
             else if calendarComponents.day == 1 
                println("Tomorrow")
             else 
                println("Today")
            
        

        println()
        tableView.reloadData()

     else 
        println("Could not fetch \(error), \(error!.userInfo)")
    


目前,此函数不使用我的子类化对象,但除了需要将值转换为 NSDate 对象之外,它不会产生任何影响。

我的问题是,如何将这些对象插入UITableView。我知道这是一个相当广泛的问题,但老实说,我不知道还能做什么。我尝试过使用多个数组,每个类别一个,但效果不佳 - 如果其中一个数组为空,就会出现问题。如何对这些对象进行排序,以便它们可以在UITableView 中插入一次?

【问题讨论】:

那段代码看起来很眼熟:) 这是一个来自 Apple 的示例项目,它演示了如何根据日期将表格视图分组为多个部分:developer.apple.com/library/ios/samplecode/DateSectionTitles/…。这是一个类似的问题(在 Objective-C 中):***.com/questions/20249098/…. @MartinR 这对我很有帮助,我正在争论是否应该链接我的 CodeReview 问题,但决定反对。 :P 我会看看 Apple 的项目以及 Wain 所说的,非常感谢您一直以来的帮助。 【参考方案1】:

我会考虑稍微移动一下您的逻辑,并使用获取的结果控制器来处理切片。

要使用获取的结果控制器,请创建一个获取并按日期添加排序描述符。这将是一个简单的列表,您可以先开始工作。

然后,向您的子类添加一个瞬态属性,您应该在其中返回对象所属部分的字符串(结果可以被缓存,因此您不会一直重新计算它)。将此瞬态属性的名称设置为 FRC 上的节名称键路径。

【讨论】:

部分标识符的瞬态属性可能无法直接返回部分名称(“Today”、“Tomorrow”、...),因为这样不会正确排序。 Here 我建议改用数字(在 titleForHeaderInSection 中翻译为“真实”的部分名称)。【参考方案2】:

我建议您查看 NSFetchedResultsController 类。它专门设计用于将核心数据显示到表格视图中。

NSFetchedResultsController

您可以添加排序描述符,这将使您的排序和组织,并支持向左滑动删除功能。在管理表格视图中的核心数据时,它为您做了很多繁重的工作。

【讨论】:

以上是关于通过 NSDate 对元素进行排序并添加到 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 NSDate 输入对表格视图进行排序(格式化为 MMM yyyy)

今天按 NSDate 对 NSArray 进行排序

如何按日期降序对 NSDate 进行排序,但在该日期内时间升序?

按对象方法的结果对 NSArray 进行排序

添加和删​​除对表格进行排序的元素类

如何对包含空元素的对象数组进行排序?