J'essaie de limiter le nombre d'objets dans un contrôleur RAID, mais je veux toujours pouvoir accéder à la totalité de la matrice, si nécessaire. Une solution simple que j'ai trouvé était de sous-classer NSArrayController, et de définir une nouvelle méthode nommée "limitedArrangedObjects", qui retourne un nombre limité d'objets de l'ensemble réel des objets arrangés. (J'ai vu Limiting the number of objects in NSArrayController, mais cela ne résout pas mon problème.)Sous-classe NSArrayController afin de limiter la taille de arrangedObjects
Je veux que cette propriété soit observable via les bindings, donc j'ai mis une dépendance à arrangedObjects dessus.
Le problème est que, lorsque arrangedObjects est mis à jour, limitedArrangedObjects ne semble pas observer le changement de valeur dans arrangedObjects. J'ai connecté un NSCollectionView à limitedArrangedObjects, et zéro objets sont affichés. (Si je le lie à arrangedObjects à la place, tous les objets s'affichent comme prévu.)
Quel est le problème?
Voici le code correspondant:
@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;
}
Cela pourrait potentiellement être une solution élégante, mais cela ne semble pas fonctionner si j'ai besoin de lier des sous-propriétés de completeArrangedObjects. Par exemple, j'ai une propriété des objets dans le NSArrayController appelée "nom", et je peux lier à cela dans une vue de table séparée. Si j'Override arrangeObjects: et créer une nouvelle propriété completeArrangedObjects, je ne peux pas lier au "nom" sous-propriété, comme il jette une exception: [ addObserver: forKeyPath: Options: contexte:] ne sont pas pris en charge. Chemin clé: artiste –