3

配列コントローラー内のオブジェクトの数を制限しようとしていますが、必要に応じて配列全体にアクセスできるようにしたいと考えています。私が思いついた簡単な解決策は、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;
}
4

2 に答える 2

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する場合は、適切なときに KVO 通知もトリガーする必要があります。

于 2010-05-07T02:53:35.130 に答える
-1

どこで/誰が私にこれを言ったのか思い出せませんが、keyPathsForValuesAffectingValueForKey: を使用して「arrangedObjects」キーを監視することは、現在 NSArrayControllers では機能しないと通知されました。サブキー (arrangedObjects.name など) を観察することはできますが、arrangedObjects を直接観察することはできません。

したがって、私の場合の解決策は、nib ファイルに 2 つのインスタンス化されたオブジェクト、通常の NSArrayController と AFArrayController を作成することでした。AFArrayController には、次のように定義された ArrangeObjects: があります。

- (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 で ArrangeObjects を観察でき、限定されたセットを取得したい場合は AFArrayController で ArrangeObjects を観察でき、NSArrayController と AFArrayController の両方でサブプロパティを観察できます。

于 2010-08-08T04:04:44.173 に答える