在我的集合视图中,我需要为每个项目生成一个索引。当项目得到重新排序时,我需要使用此索引来更新其新位置。
数据是托管NSArrayController中的核心数据实体。 我最接近可能的解决方案是在实体类上实现此方法,然后使用 representObject.dynamicIndex 将其绑定到UI。
- (NSNumber *) dynamicIndex
{
NSInteger r = [[[[self managedObjectContext] registeredObjects] allObjects] indexOfObject:self];
NSNumber *result = [NSNumber numberWithInt:r];
return result;
}
这个解决方案充其量只是粗略的,并没有真正的功能,因为它不一定反映集合视图中的顺序。
任何人都有在NSCollectionView中生成或检索项目索引的模型/机制吗?
答案 0 :(得分:1)
首先,请确保您了解(并正确使用术语)“实体”和“实例”之间的区别。它将您的问题/解决方案与他人沟通起到了重要作用。
第二:不要担心NSCollectionViewItems ...担心每个人的“代表对象”,它存放在某个容器中。
第三:您是否希望显示顺序成为您实体的持久属性,或者您只是需要知道该项目当前处于什么位置,而不管以后可能是什么?重要的问题。
第四:核心数据没有为您提供有序集合的概念。这是为了支持商店类型,例如NSSQLiteStoreType,您可能只想在几个项目(或一个)中出错而不加载整个列表。因此,如果您想要持久排序顺序,则可以自行处理。要执行此操作,只需向您的实体添加一个名为“sortOrder”的属性,并将其设置为数字类型。
第五:由于上面的“无序集合”问题,你试图从一个数组中找到你的实体的给定实例的索引,这个数组是从一个集合构建的,这个数组是以一个非确定性顺序出现故障注定要失败
第六:由于您使用的是阵列控制器,因此您需要设置其排序描述符。您将要使用“sortOrder”键。这样,您获取的实例将始终按其“sortOrder”进行排序。
第七个也是最后一个:如果你想要获取数组控制器的对象集/对象中的任何对象的索引,你会想要它的-arrangedObjects,所以你'获取数组控制器控制的排序集合中对象的索引。
希望有所帮助。
Lion的更新(10.7)
关于我的第六点:如果您的应用程序中的目标是10.7及更高版本,[NSManagedObject现在为您提供有序关系。] [1]使用-mutableOrderedSetValueForKey:和-mutableOrderedSetValueForKey:设置和检索NSOrderedSets。耶!