gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:52:09 26 4
gpt4 key购买 nike

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

@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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com