2010-05-07 1 views
3

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

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

Проблема заключается в том, что при размещении объектов обновляются, limitedArrangedObjects, похоже, не соблюдает изменение значения в builtObjects. Я подключил NSCollectionView к limitedArrangedObjects, и отображаются нулевые объекты. (Если я привяжу его к builtObjects, все объекты появятся, как ожидалось.)

В чем проблема?

Вот соответствующий код:

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

ответ

-1

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

Итак, решение в моем случае состояло в том, чтобы создать два экземпляра объектов в моем файле nib, обычном NSArrayController и AFArrayController. AFArrayController имеет arrangedObjects: определяется как таковую:

- (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; 
} 

Теперь я могу наблюдать arrangedObjects на NSArrayController, если я хочу, чтобы все объекты, или arrangedObjects на 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, и так как вы используете сеттер для completeArrangedObjects, который должен также вызвать уведомление Кво, когда это необходимо, если вы хотите связать к нему.

+0

Это потенциально может быть изящным решением, но, похоже, оно не работает, если мне нужно привязать к дополнительным свойствам completeArrangedObjects. Например, у меня есть свойство объектов в NSArrayController, называемое «name», и я могу привязываться к нему в отдельном представлении таблицы. Если я переопределить arrangeObjects: и создать новую completeArrangedObjects собственность, я не могу связать с «именем» Подствойство, как он бросает исключение: [ addObserver: forKeyPath: варианты: контекст:] не поддерживается. Путь к ключу: художник –

 Смежные вопросы

  • Нет связанных вопросов^_^