3

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

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 任务对象添加一个单独的完成日期字段(这还不是一个运输应用程序,所以我可以随意更改数据格式)。

4

1 回答 1

3

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

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

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

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

对于第二部分,它将只使用completedDate(最新的优先),所以你去。

于 2012-06-10T04:51:24.990 回答