Subclassification of NSArrayController to Limit the Size of Arranged Objects

I am trying to limit the number of objects in an array controller, but still want to have access to the full array if necessary. The simple solution I came across was to subclass NSArrayController and define a new method called "limitedArrangedObjects" that returns a limited number of objects from a real set of ordered objects. (I saw the number limit of objects in NSArrayController , but that does not concern my problem.)

I want this property to be observable through bindings, so I establish a dependency on it.

The problem is that when ordered objects are updated, restricted ArrangedObjects don't seem to observe a change in value in ordered objects. I connected NSCollectionView to limitedArrangedObjects and null objects are displayed. (If I attach it to ordered objects, all objects will appear as expected.)

What is the problem?

Here is the relevant code:

@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;
}
+3
source share
2 answers

, / , , "assemblyObjects" keyPathsForValuesAffectingValueForKey: NSArrayControllers. - ( ..), .

, 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.

-1

, -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, , .

+1

Source: https://habr.com/ru/post/1744431/


All Articles