在使用Core Data作为后备存储的UITableViewController
中实现用户定义的排序需要执行哪些步骤?
我还需要回复-tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:
还是表格视图会自动处理模型重新排序?我可以只检查Core Data模型文件中的“Ordered”复选框,并期望它将更改从表视图传输到商店,还是我必须做更多?我是否必须更改fetchedResultsController
获取对象的方式(例如添加排序描述符)?
答案 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:
答案 2 :(得分:0)
我是核心数据实体的一个属性,假设它是NSNumber
,称为sortOrder
。
在此列表中初始化新对象时,按递增顺序分配sortOrder
,以便存在默认排序顺序。
最后,请告知您的fetchedResultsController
为此sortOrder属性使用额外的sortDescriptor
。
当用户调整条目的位置时,您可以将sortOrder
设置为其前后条目的平均值。
(只是一个想法 - 我没有处理过这个问题或者必须实现它,但是正在考虑我的项目。)