我试图限制数组控制器中对象的数量,但是如果有必要,我仍然希望能够访问整个数组。我想到的一个简单解决方案是子类化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/

10-12 05:42