设置
我有一个NSTreeController
子类。它有一个名为的属性selectedProject
,它是自定义的,并在标题中声明如下:
@property (nonatomic, readonly) LPProject *selectedProject;
在私有实现中就像这样:
@property (nonatomic, readwrite, assign) LPProject *selectedProject;
至关重要的是,在我selectedProject
在 TreeController 中修改的每一个点,我都会检查生成的 setter/getter。我从不直接修改 iVar。
基本上,这个属性存在的原因是因为没有键入的 normalselectedObjects
和selection
properties,NSTreeController
而且我知道这个 TreeController 将始终只管理 LPProject 对象并且一次只能选择一个项目,我想要一个干净的 iVar使用,而不是不断获取 selectedObjects,检查是否有,获取数组中的第一个对象等。
LP项目
LPProject
是NSManagedObject
Core Data 的自定义子类。它有一个名为 的属性enabled
。此属性是一个 BOOL,由 NSNumber 表示。它的 getter/setter 由 Xcode 生成。
问题
在几个控制器中,我尝试观察对象的enabled
属性selectedProject
,如下所示:
[_myTreeController addObserver:self
forKeyPath:@"selectedProject.enabled"
options:0
context:NULL];
我已经验证了 KVO 通知在selectedProject
更改时到达(并因此selectedProject.enabled
发生更改)。但是,当只有enabled
属性发生变化时selectedProject
(即选定的项目本身保持不变),KVO 通知不会到达。
但是,如果我改为以这种方式订阅:
[_myTreeController addObserver:self
forKeyPath:@"selection.enabled"
options:0
context:NULL];
它完美地工作。当enabled
更改并selectedProject
保持不变时,KVO 通知到达。
我对此感到困惑,因为selectedProject
它符合 KVO,而且我觉得 keypath.enabled
应该可以工作。
任何人都可以阐明这一点吗?我错过了什么?