使用UITableView和NSOrderedSet排序核心数据

nev*_*ing 10 core-data uitableview ios ios5 nsorderedset

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

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

Ric*_*ble 8

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

- (NSUInteger)indexInBookChapters
{
    NSUInteger index = [self.book.chapters indexOfObject:self];
    return index;
}
Run Code Online (Sandbox Code Playgroud)

提示:将其添加到类别中,以免被CoreData自动生成的代码覆盖.

然后,您可以在NSFetchedResultsController的排序描述符中使用此方法:

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"indexInBookChapters" ascending:YES]];
Run Code Online (Sandbox Code Playgroud)

  • @RichardVenable你试过吗?如果使用SQLite存储,```NSFetchedResultsController```将无法使用此类排序描述符. (3认同)
  • 实际上,在Apple关于Core Data的文档中有很多关系,他们为许多场景推荐第三个对象,甚至说"中间实体的一个优点是你也可以使用它来为关系添加更多信息 - 例如" FriendInfo"实体可能包含一些关于友谊力量的指示,具有"排名"属性." 在我们的例子中,额外的信息将是索引.顺便说一句,我只是说它很少见,因为虽然我遇到了多对多关系的许多用途,但我从未遇到需要订购的问题.你呢? (2认同)

bry*_*ark 0

我有一个 Core Data 实体的属性,假设它是一个NSNumber被调用的sortOrder.

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

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

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

(只是一个想法——我还没有处理这个问题或必须实现它,但正在为我的项目考虑它。)

  • 实际上,核心数据不支持将排序+显示映射到开箱即用的表视图和集合视图上,这实际上是令人难以置信的蹩脚! (2认同)