0

NSArrayControllerサブクラスの「items」(カスタム)プロパティに配列がバインドされているNSTreeControllerがあります。ツリーコントローラーはNSArrayControllerの選択にバインドされていないため、アレイコントローラーの選択が変更された後にアイテムをフェッチする必要があることをツリーコントローラーに通知する必要があります。

NSArrayControllerのサブクラスで次のことを行いました。

+ (NSSet *)keyPathsForValuesAffectingItems
{
    return [NSSet setWithObjects:@"selectedObjects",nil];
}

これで十分なAFAIKになるはずです。クラスメソッドが呼び出されますが、効果がないようです。

オブザーバーを実装すると、正常にselectedObjects機能します。

- (void)awakeFromNib;
{
    [self addObserver:self forKeyPath:@"selectedObjects" options:0 context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(NSObjectController *)context;
{
    if ([keyPath isEqual:@"selectedObjects"]) {
        [self willChangeValueForKey:@"items"];
        [self didChangeValueForKey:@"items"];
    }

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

どんな手掛かり?

4

1 に答える 1

0

まず、「items」はNSArrayControllerの監視可能なプロパティではありません。アレイコントローラがコレクションを管理するクラスのプロパティだということですか?つまり、Fooの配列を管理し、Fooにはプロパティ「items」がありますか?

いずれにせよ、あなたはこれを必要以上に難しくしています。ツリーコントローラーのコンテンツをアレイコントローラーのselection.itemsパスにバインドしてみませんか?これが不可能な状況はほとんどありません。

于 2009-12-30T15:16:46.503 に答える