我试图限制数组控制器中对象的数量,但是如果有必要,我仍然希望能够访问整个数组。我想到的一个简单解决方案是子类化NSArrayController,并定义一个名为“ limitedArrangedObjects”的新方法,该方法从实际排列的对象集中返回有限数量的对象。 (我见过Limiting the number of objects in NSArrayController,但这不能解决我的问题。)
我希望通过绑定可以观察到此属性,因此我将依赖项设置为其上的rangedObjects。
问题是,当更新organizedObjects时,limitedArrangedObjects似乎没有观察到organizedObjects中的值更改。我已经将NSCollectionView连接到limitedArrangedObjects,并且正在显示零个对象。 (如果我改为将其绑定到rangedObjects,则所有对象都会按预期显示。)
有什么问题?
以下是相关代码:
@property (readonly) NSArray *limitedArrangedObjects;
- (NSArray *)limitedArrangedObjects;
{
NSArray *arrangedObjects = [super arrangedObjects];
NSUInteger upperLimit = 10000;
NSUInteger count = [arrangedObjects count];
if (count > upperLimit) count = upperLimit;
arrayToReturn = [arrangedObjects subarrayWithRange:NSMakeRange(0, count)];
return arrayToReturn;
}
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key;
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"limitedArrangedObjects"]) {
NSSet *affectingKeys = [NSSet setWithObjects:@"arrangedObjects",nil];
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
}
return keyPaths;
}
最佳答案
我可能会采用另一种方法,那就是覆盖-arrangeObjects:
,它可以过滤出对象,然后设置诸如completeArrangedObjects
的辅助属性,以使您可以访问整个数组。看起来像这样:
- (NSArray*)arrangeObjects:(NSArray*)originalObjects
{
NSArray* arrayToReturn;
NSUInteger upperLimit = 10000;
NSUInteger count = [originalObjects count];
if (count > upperLimit) count = upperLimit;
arrayToReturn = [arrangedObjects subarrayWithRange:NSMakeRange(0, count)];
[self setCompleteArrangedObjects:originalObjects];
return arrayToReturn;
}
然后,您只需将NSCollectionView绑定到
arrangedObjects
,并且由于您正在使用completeArrangedObjects
的setter,因此,如果您也想绑定到它,则还应在适当时触发KVO通知。关于cocoa - 子类化NSArrayController,以限制rangedObjects的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2785662/