objective-c - 您如何向依赖于子属性的只读@property 发出更新信号?

标签 objective-c cocoa key-value-observing

这是一个简化的例子,应该足以解决这个问题。

@interface MyClass: NSObject {
   Person *_owner;
}
   @property (strong) Person *owner;
   @property (readonly) BOOL hasSomething;
@end

@implementation
   // other code here like -init
   - (void)setOwner:(Person *)newOwner
   {
       [_owner removeObserver:self forKeyPath:@"stuff"];
       _owner = newOwner;
       [_owner addObserver:self forKeyPath:@"stuff" options:0 context:NULL];
   }
   - (Person*)owner
   {
       return _owner;
   }
   - (BOOL)hasSomething
   {
       return owner.stuff > 0;
   }
   - (void)observeValueForKeyPath:(NSString*)kp ofObject:(id)obj change:(NSDictionary*)ch context:(void*)c
   {
       if ([kp isEqualtToString:@"stuff"]) {
           [self willChangeValueForKey:@"hasSomething"];
           [self didChangeValueForKey:@"hasSomething"];
       }
   }
@end

在我的例子中,任何绑定(bind)到 hasSomething 的东西都没有被正确地通知值的变化。我错过了什么?

最佳答案

我的解决方法: 我最初通过直接绑定(bind)到我想要跟踪的值来解决这个问题。在给出的示例中,它看起来像 arrangedObjects.owner.stuff

我的解决方案: 后来我重新访问了代码,发现我所拥有的基本上是正确的。这个想法是封装对象层次结构的内部工作(如果你像我上面的解决方法那样绑定(bind)整个路径就无法实现)。在问题中,我将问题简化为具有两个级别的层次结构:MyClass -> Person。我的代码实际上涉及更多的层次和一对多的关系。层次结构中的元素之一没有正确观察其子元素。


Denis 建议我看一下 -automaticallyNotifiesObserversForKey:,我照做了。根据我的理解,如果您想在属性的 setter 方法中手动发送通知,您可能希望该方法返回 NO。否则,您的通知会与自动通知发生冲突。

- (void)setHasSomething:(BOOL)newVal
{
    [self willChangeValueForKey:@"hasSomething"];
    // ...
    [self didChangeValueForKey:@"hasSomething"];
}

因为只读属性没有 setter 方法,所以没有解决我的问题。


经验教训:1) 正确观察您的 child ; 2) 寻求帮助时不要过度简化问题。

关于objective-c - 您如何向依赖于子属性的只读@property 发出更新信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9486501/

相关文章:

objective-c - 在 Cocoa 中获取 Mac 型号

iphone - 外部类里面的KVO无法正常工作

iphone - unarchiveObjectWithFile 需要保留/自动释放吗?

objective-c - NSFileManager 或 NSTask 移动文件类型

objective-c - MKAnnotationView 缩放时不会保持在原位

iphone - 平行阵列

objective-c - 在 OSX 中监视屏幕保护程序事件

ios - [iOS]KVO setValuesForKeysWithDictionary

objective-c - 如何使用 KVO 更新属性

ios - UISlider 最小和最大轨道色调清除颜色 iOS 7.1 错误