使用UITableView和NSOrderedSet核心数据sorting

在Core Data作为后备存储的UITableViewController ,我需要执行什么步骤来实现用户定义的sorting?

我仍然需要响应-tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:或者是由表视图自动处理的模型重新sorting? 我可以只检查核心数据模型文件中的“有序”checkbox,并期望它将表视图中的变化传输到商店,还是我必须做更多? 我必须改变我的fetchedResultsController获取它的对象的方式(例如添加一个sorting描述符)吗?

您不需要放弃NSFetchedResultsController或NSOrderedSet 。 如果你坚持使用NSOrderedSet,最简单的方法就是将一个方法添加到NSManagedObject子类的对象中。 所以,举个例子,如果你有一个具有一组有序章节的对象Book,你可以添加一个方法给章节对象:

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

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

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

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

这里最好的做法是不使用fetchedResultsController因为它需要一个sorting描述符,正如你所提到的那样。 你可以使用虚拟属性,但这显然不是好的做法。 相反,在tableView:cellForRowAtIndexPath:使用objectAtIndex tableView:cellForRowAtIndexPath:并在需要时重新加载表数据,也许使用Key-Value Observing ,尽pipe取决于您的使用情况,可能会有更简单和更less碰撞倾向的方法。

是的,你将不得不实现tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:

也可以看看

NSFetchedResultsController和NSOrderedSet关系

我想要一个属性到核心数据实体,让我们说这是一个名为sortOrderNSNumber

在此列表中初始化一个新对象时,请按递增顺序分配sortOrder ,以便默认sorting顺序在此处。

最后,告诉你的fetchedResultsController为这个sortOrder属性使用一个额外的sortDescriptor

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

(只是一个想法—我没有处理这个问题,或者不得不实施它,但考虑到我的项目的下线。)