Создание подкласса NSArrayController для ограничения размера упорядоченных объектов - PullRequest
3 голосов
/ 07 мая 2010

Я пытаюсь ограничить количество объектов в контроллере массива, но я все еще хочу иметь возможность доступа к полному массиву, если это необходимо. Простое решение, которое я придумал, состояло в том, чтобы создать подкласс NSArrayController и определить новый метод с именем «limitedArrangedObjects», который возвращает ограниченное число объектов из реального набора упорядоченных объектов. (Я видел ограничение количества объектов в NSArrayController , но это не решает мою проблему.)

Я хочу, чтобы это свойство можно было наблюдать с помощью привязок, поэтому я установил для него зависимость от расположения упорядоченных объектов.

Проблема заключается в том, что при обновленииorgOrangeTyjects 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;
}

Ответы [ 2 ]

1 голос
/ 07 мая 2010

Я бы, вероятно, выбрал другой подход, который состоял бы в переопределении -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, это также должно вызывать уведомления KVO, когда это необходимо, если вы хотите привязать к нему также.

0 голосов
/ 08 августа 2010

Я не могу вспомнить, где / кто мне это сказал, но мне сообщили, что наблюдение за ключом "agedObjects "с помощью keyPathsForValuesAffectingValueForKey: в настоящее время не работает для NSArrayControllers. Вы можете наблюдать вложенные ключи (layoutObjects.name и т. Д.), Но вы не можете наблюдать расположенные объекты напрямую.

Итак, решение в моем случае состояло в том, чтобы создать два экземпляра объекта в моем файле пера, обычный 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.

...