配列コントローラー内のオブジェクトの数を制限しようとしていますが、必要に応じて配列全体にアクセスできるようにしたいと考えています。私が思いついた簡単な解決策は、NSArrayController をサブクラス化し、「limitedArrangedObjects」という名前の新しいメソッドを定義することでした。このメソッドは、配置されたオブジェクトの実際のセットから限られた数のオブジェクトを返します。( NSArrayController のオブジェクト数の制限を見てきましたが、それは私の問題に対処していません。)
このプロパティをバインディング経由で監視できるようにしたいので、その上で ArrangeObjects への依存関係を設定します。
問題は、arrangedObjects が更新されたときに、limitedArrangedObjects が ArrangeObjects の値の変更を監視していないように見えることです。NSCollectionView を limitedArrangedObjects に接続しましたが、表示されるオブジェクトはありません。(代わりにそれを ArrangeObjects にバインドすると、すべてのオブジェクトが期待どおりに表示されます。)
どうしたの?
関連するコードは次のとおりです。
@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;
}