1

セットアップ

私はNSTreeControllerサブクラスを持っています。selectedProjectカスタムであり、ヘッダーで次のように宣言されているというプロパティがあります。

@property (nonatomic, readonly) LPProject *selectedProject;

プライベート実装では次のようになります。

@property (nonatomic, readwrite, assign) LPProject *selectedProject;

重要なのは、TreeController で変更するすべてのポイントでselectedProject、生成されたセッター/ゲッターを通過することです。iVar を直接変更することはありません。

基本的に、このプロパティが存在する理由は、通常のプロパティselectedObjectsselectionプロパティNSTreeControllerが型指定されていないためです。この TreeController は常に LPProject オブジェクトのみを管理し、一度に選択できるプロジェクトは 1 つだけであることがわかっているため、クリーンな iVar が必要でした。 selectedObjects を常に取得するのではなく、存在するかどうかを確認し、配列内の最初のオブジェクトを取得するなどの方法を使用します。


LPプロジェクト

LPProjectCore DataのカスタムNSManagedObjectサブクラスです。という名前のプロパティがありますenabled。このプロパティは、NSNumber で表される BOOL です。そのためのゲッター/セッターは Xcode によって生成されます。


問題

いくつかのコントローラーで、次のようにオブジェクトのenabledプロパティを監視しようとします。selectedProject

[_myTreeController addObserver:self 
                    forKeyPath:@"selectedProject.enabled" 
                       options:0 
                       context:NULL];

selectedProjectKVO 通知が変更 (およびその結果の変更)時に届くことを確認しましたselectedProject.enabled。ただし、プロパティのみが変更された場合(つまり、選択したプロジェクト自体が変更されていない場合)、KVO 通知は届きません。enabledselectedProject

ただし、代わりにこの方法で購読する場合:

[_myTreeController addObserver:self 
                    forKeyPath:@"selection.enabled" 
                       options:0 
                       context:NULL];

それは完全に機能します。enabled変化して変わらない場合selectedProject、KVO 通知が届きます。

KVOに準拠していて、キーパスが機能するはずだselectedProjectと思うので、私はこれに混乱しています。.enabled

誰でもこれに光を当てることができますか?私は何を逃したのですか?

4

1 に答える 1