【问题标题】:NSFetchedResultsController sort different sections differently (ascending/descending)?NSFetchedResultsController 对不同的部分进行不同的排序(升序/降序)?
【发布时间】:2012-06-10 04:27:43
【问题描述】:

在我的应用程序中,我有一个任务列表(不,它不仅仅是另一个待办事项应用程序),我使用NSFetchedResultsControllerUITableView 中显示任务。下面是相关的初始化代码:

NSSortDescriptor *dueDateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"due" YES];
NSSortDescriptor *completionSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"completed" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:completionSortDescriptor, dueDateSortDescriptor, nil]];

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"completed" cacheName:nil];

它的作用是对任务进行排序,使我在顶部有一个不完整的任务部分,将首先到期的任务排序在顶部,然后将到期的任务进一步向下排序。这一切都有效。

然而,这意味着第二部分,即完成任务的部分,也是这样排序的,所以最早到期的任务在最前面。我想要做的是更改它,以便第二部分以相反的方式排序(按降序排列),但第一部分保持按升序排序。这甚至可能吗?我该怎么办?

我为什么要这样做:按照目前的工作方式,第二部分顶部的任务(因此也是最明显的)是很久以前完成的任务。用户更有可能希望查看最近完成的任务(如果不小心选中了一项,则取消选中),并且可能具有较近截止日期的任务是最近完成的。如有必要,我很乐意为 Core Data 任务对象添加一个单独的完成日期字段(这还不是一个运输应用程序,所以我可以随意更改数据格式)。

【问题讨论】:

    标签: iphone objective-c ios sorting core-data


    【解决方案1】:

    这在使用 NSFetchedResultsController 时是不可能的。您必须手动获取数据并实现 UITableView 的委托方法。

    编辑:哇,我的错,有一个相当简单的解决方案。设置两个排序描述符:

    • completedDate 的第一个(降序)。对于所有未完成的任务,此字段都是相同的 (nil)。

    • addedDate(升序)添加第二个。它将按完成日期排序(最新的在前),但在第一部分中您不会有任何已完成的日期,因此它将使用添加的日期(最旧的在前)。

    对于第二部分,它将只使用completedDate(最新的优先),这样就可以了。

    【讨论】:

    • 谢谢 ;) 接下来我会讲到这个,让你知道它是怎么回事。
    • 完美运行。非常感谢!我还必须为完成状态添加一个排序描述符并将其放在第一位,因为没有它,完成的任务会出现在未完成的任务之上(有时)。但是,现在一切正常,再次感谢 ;)
    • 在没有看到具体数据的情况下,我无法真正说出这是怎么发生的,但是一个提示(给你,或者后来发现这个线程的人):将完成状态字段设置为临时字段(意味着它赢了'不存储在您的数据库中),然后在您的 NSManagedObject 子类中创建一个访问器方法(假设您有一个),您可以在其中读取完成日期。这样,当您更新要完成的任务时,您不必更新两个字段(可能会忘记一个)。
    • 我现在正在做的是在NSManagedObject 子类中覆盖didChangeValueForKey: 并检查completed 属性的修改(因为我已经编写了很多直接更改布尔值的代码,我懒得去修改它),并将completedDate设置为当前日期或nil
    • 哦,是的,这也有效。只要更新一个字段也会自动更新另一个字段,这样您作为程序员就不必担心了。
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多