使用UITableView和NSOrderedSet排序核心数据

时间:2012-03-26 16:01:15

标签: ios uitableview core-data ios5 nsorderedset

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

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"indexInBookChapters" ascending:YES]];

答案 1 :(得分:1)

这里的最佳做法是不使用fetchedResultsController,因为它需要排序描述符,如您所述。你可以使用虚拟财产,但这显然不是一个好习惯。相反,在objectAtIndex中使用tableView:cellForRowAtIndexPath:并在需要时重新加载表数据,可能使用Key-Value Observing,但根据您的使用情况,可能会有更简单且更少崩溃的方法。< / p>

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

另见

  

NSFetchedResultsController and NSOrderedSet relationships

答案 2 :(得分:0)

我是核心数据实体的一个属性,假设它是NSNumber,称为sortOrder

在此列表中初始化新对象时,按递增顺序分配sortOrder,以便存在默认排序顺序。

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

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

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