设置我有一个NSTreeController子类。它有一个名为selectedProject的属性,该属性是自定义的,并在标头中声明为:@property (nonatomic, readonly) LPProject *selectedProject;像这样在私有实现中:@property (nonatomic, readwrite, assign) LPProject *selectedProject;至关重要的是,在我在TreeController中修改selectedProject的每一个地方,我都会遍历生成的setter。我从不直接修改iVar。基本上,此属性存在的原因是因为未键入selectedObjects的常规selection和NSTreeController属性,并且由于我知道TreeController始终将仅管理LPProject对象,并且只能在以下位置选择一个项目一次,我希望使用一个不错的干净的iVar,而不是不断获取selectedObjects,检查是否存在,在数组中获取第一个对象,等等。LP项目LPProject是Core Data的自定义NSManagedObject子类。它具有一个名为enabled的属性。此属性是一个BOOL,由NSNumber表示。它的获取器/设置器由Xcode生成。问题在几个控制器中,我尝试观察enabled对象的selectedProject属性,如下所示:[_myTreeController addObserver:self forKeyPath:@"selectedProject.enabled" options:0 context:NULL];我已经验证了selectedProject更改时(因此,selectedProject.enabled更改)会到达KVO通知。但是,当仅enabled的selectedProject属性发生更改时(即所选项目本身保持不变),KVO通知不会到达。但是,如果我改为这样订阅:[_myTreeController addObserver:self forKeyPath:@"selection.enabled" options:0 context:NULL];它运作完美。当enabled更改且selectedProject保持不变时,KVO通知到达。我对此感到困惑,因为selectedProject是KVO兼容的,我觉得.enabled的关键路径应该可以工作。谁能阐明这一点?我错过了什么? 最佳答案 我不知道您如何以及何时更新selectedProject属性,但是由于基于selection的方法按预期方式工作(不仅如此),因此我建议您将selectedProject设为(因为selectedObjects是代理,selection也是KVO):// tell Cocoa which property changes directly affect selectedProject+ (NSSet*)keyPathsForValuesAffectingSelectedProject { return [NSSet setWithObject:@"selectedObjects"];}- (LPProject*)selectedProject { // you might need to do some isKindOfClass checks if not all nodes are LPProject return self.selectedObjects.first;}标头属性声明保持不变,如果提供了setter,则不需要实现声明。这样做的好处是,当selectedObjects更改时,运行时将自动为selectedProject属性发送KVO通知,并且粘合代码最少。关于objective-c - NSTreeController:自定义属性键路径的KVO失败。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35006846/
10-09 16:26