3

我正在尝试限制数组控制器中的对象数量,但如果需要,我仍然希望能够访问整个数组。我想出的一个简单的解决方案是继承 NSArrayController,并定义一个名为“limitedArrangedObjects”的新方法,它从真实的排列对象集中返回有限数量的对象。(我已经看到限制 NSArrayController 中的对象数量,但这并不能解决我的问题。)

我希望这个属性可以通过绑定来观察,所以我在它上面设置了一个对arrangedObjects 的依赖。

问题是,当排列对象被更新时,limitedArrangedObjects 似乎没有观察到排列对象中的值变化。我已经将 NSCollectionView 连接到 limitedArrangedObjects,并且正在显示零个对象。(如果我将它绑定到排列对象,所有对象都会按预期显示。)

有什么问题?

以下是相关代码:

@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;
}
4

2 回答 2

1

我可能会采用不同的方法,即 override -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,并且由于您使用的是 setter completeArrangedObjects,因此如果您还想绑定到它,它也应该在适当的时候触发 KVO 通知。

于 2010-05-07T02:53:35.130 回答
-1

我不记得在哪里/谁告诉我这个,但我被告知使用 keyPathsForValuesAffectingValueForKey 观察“arrangedObjects”键:目前不适用于 NSArrayControllers。可以观察子键(arrangedObjects.name等),但不能直接观察arrangedObjects。

因此,我的解决方案是在我的 nib 文件中创建两个实例化对象,一个普通的 NSArrayController 和一个 AFArrayController。AFArrayController 有排列对象:定义如下:

- (NSArray *)arrangedObjects;
{
    return [self limitedArrayFromArray:[super arrangedObjects]];
}

- (NSArray *)limitedArrayFromArray:(NSArray *)theArray;
{
    NSUInteger upperLimit = 0;
    if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_5) {
        upperLimit = 500;
    } else {
        upperLimit = 10000;
    }

    NSUInteger count = [theArray count];
    if (count > upperLimit) count = upperLimit;
    NSArray *arrayToReturn = [theArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, count)]];


    return arrayToReturn;
}

现在,如果我想获得所有对象,我可以观察 NSArrayController 上的排列对象,或者如果我想获得有限集合,我可以观察 AFArrayController 上的排列对象,并且我可以观察 NSArrayController 和 AFArrayController 上的子属性。

于 2010-08-08T04:04:44.173 回答