セットアップ
私はNSTreeController
サブクラスを持っています。selectedProject
カスタムであり、ヘッダーで次のように宣言されているというプロパティがあります。
@property (nonatomic, readonly) LPProject *selectedProject;
プライベート実装では次のようになります。
@property (nonatomic, readwrite, assign) LPProject *selectedProject;
重要なのは、TreeController で変更するすべてのポイントでselectedProject
、生成されたセッター/ゲッターを通過することです。iVar を直接変更することはありません。
基本的に、このプロパティが存在する理由は、通常のプロパティselectedObjects
とselection
プロパティNSTreeController
が型指定されていないためです。この TreeController は常に LPProject オブジェクトのみを管理し、一度に選択できるプロジェクトは 1 つだけであることがわかっているため、クリーンな iVar が必要でした。 selectedObjects を常に取得するのではなく、存在するかどうかを確認し、配列内の最初のオブジェクトを取得するなどの方法を使用します。
LPプロジェクト
LPProject
Core DataのカスタムNSManagedObject
サブクラスです。という名前のプロパティがありますenabled
。このプロパティは、NSNumber で表される BOOL です。そのためのゲッター/セッターは Xcode によって生成されます。
問題
いくつかのコントローラーで、次のようにオブジェクトのenabled
プロパティを監視しようとします。selectedProject
[_myTreeController addObserver:self
forKeyPath:@"selectedProject.enabled"
options:0
context:NULL];
selectedProject
KVO 通知が変更 (およびその結果の変更)時に届くことを確認しましたselectedProject.enabled
。ただし、プロパティのみが変更された場合(つまり、選択したプロジェクト自体が変更されていない場合)、KVO 通知は届きません。enabled
selectedProject
ただし、代わりにこの方法で購読する場合:
[_myTreeController addObserver:self
forKeyPath:@"selection.enabled"
options:0
context:NULL];
それは完全に機能します。enabled
変化して変わらない場合selectedProject
、KVO 通知が届きます。
KVOに準拠していて、キーパスが機能するはずだselectedProject
と思うので、私はこれに混乱しています。.enabled
誰でもこれに光を当てることができますか?私は何を逃したのですか?