10

UITableViewController在以 Core Data 作为后备存储的情况下,我需要执行哪些步骤来实现用户定义的排序?

我是否仍需要响应-tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:或模型重新排序是否由表格视图自动处理?我可以只选中 Core Data 模型文件中的“Ordered”复选框并期望它将更改从 table view 传输到 store,还是我必须做更多?我是否必须更改fetchedResultsController获取对象的方式(例如添加排序描述符)?

4

3 回答 3

8

你不需要放弃 NSFetchedResultsController 或 NSOrderedSet。如果您坚持使用 NSOrderedSet,那么简单的方法就是向您的对象 NSManagedObject 子类添加一个方法。因此,例如,如果您有一个包含有序章节集的对象 Book,您可以向章节对象添加一个方法:

- (NSUInteger)indexInBookChapters
{
    NSUInteger index = [self.book.chapters indexOfObject:self];
    return index;
}

提示:将此添加到类别中,这样它就不会被 CoreData 自动生成的代码覆盖。

然后你可以在你的 NSFetchedResultsController 的排序描述符中使用这个方法:

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"indexInBookChapters" ascending:YES]];
于 2012-10-02T16:21:30.613 回答
1

正如您所提到的,这里的最佳做法是不使用fetchedResultsController,因为它需要一个排序描述符。您可以使用虚拟属性,但这显然不是一个好习惯。相反,在需要时使用objectAtIndexintableView:cellForRowAtIndexPath:并重新加载表数据,也许使用Key-Value Observing,但根据您的用例,可能会有更简单且不易崩溃的方法。

是的,你必须实施tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:

也可以看看

NSFetchedResultsController 和 NSOrderedSet 关系

于 2012-06-25T11:41:07.370 回答
0

我有一个核心数据实体的属性,假设它是一个NSNumber被调用的sortOrder.

当您在此列表中初始化一个新对象时,按升序分配sortOrder,以便默认排序顺序存在。

最后,告诉您为此 sortOrder 属性fetchedResultsController使用额外的。sortDescriptor

当用户调整条目的位置时,您可以将 设置sortOrder为条目前后的平均值。

(只是一个想法 --- 我还没有处理过这个问题,也没有实施它,但正在为我的项目考虑它。)

于 2012-03-26T16:05:26.783 回答