如果您可以针对 iOS 5.0 及更高版本,那么您可以使用 anNSOrderedSet
来维护对象的顺序。请记住,使用此方法的效率明显低于我在下面建议的其他方法(根据 Apple 的文档)。有关更多信息,请查看iOS 5 的核心数据发行说明。
如果您需要支持 5.0 之前的 iOS 版本或者想要使用更高效的方法,那么您应该在实体中创建一个额外的整数属性,并在添加或重新排列实体对象时手动维护其中的实体对象的索引。当需要显示对象时,您应该根据这个新属性对它们进行排序,一切就绪。例如,您的moveRowAtIndexPath
方法应如下所示:
- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath sortProperty:(NSString*)sortProperty
{
NSMutableArray *allFRCObjects = [[self.fetchedResultsController fetchedObjects] mutableCopy];
NSManagedObject *sourceObject = [self.fetchedResultsController objectAtIndexPath:sourceIndexPath];
// Remove the object we're moving from the array.
[allFRCObjects removeObject:sourceObject];
// Now re-insert it at the destination.
[allFRCObjects insertObject:sourceObject atIndex:[destinationIndexPath row]];
// Now update all the orderAttribute values for all objects
// (this could be much more optimized, but I left it like this for simplicity)
int i = 0;
for (NSManagedObject *mo in allFRCObjects)
{
// orderAttribute is the integer attribute where you store the order
[mo setValue:[NSNumber numberWithInt:i++] forKey:@"orderAttribute"];
}
}
最后,如果你觉得这太多的手工工作,那么我真的推荐使用免费的Sensible TableView框架。该框架不仅会自动为您维护订单,还会根据您的实体属性及其与其他实体的关系生成所有表格视图单元格。在我看来,这绝对是节省时间的好方法。我还知道另一个名为UIOrderedTableView的库,但我自己从未使用过它,所以我不能推荐它(以前的框架也更受欢迎)。