【问题标题】:KVO (IOS 5) on simple types (non NSObject)简单类型(非 NSObject)上的 KVO (IOS 5)
【发布时间】:2023-03-15 06:25:01
【问题描述】:

我无法让 IOS (objective-c) KVO 为 int 类型的键工作。

我的班级声明了一个 int 类型的属性 sampleValue。由于 int 不会自动实现 KVO 功能,我已经重写了 automaticallyNotifiesObserversforKey 方法,如下所示:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {

    BOOL automatic = NO;
    if ([theKey isEqualToString:@"sampleValue"]) {
        automatic = NO;
    } else {
        automatic=[super automaticallyNotifiesObserversForKey:theKey];
    }
    return automatic;
}

该方法的调用方式与我预期的一样。我还为 sampleValue 属性实现了一个 setter 方法,如下所示:

- (void) setSampleValue:(int)newSampleValue
{
    [self willChangeValueForKey:@"sampleValue"];
    sampleValue = newSampleValue;
    [self didChangeValueForKey:@"sampleValue"];
}

在观察者类中设置观察者是这样完成的(dc是被观察对象的实例):

[dc addObserver:self forKeyPath:@"sampleValue" options:NSKeyValueObservingOptionNew context:NULL];

但是,当 sampleValue 更新时,不会向我的观察者对象发送通知。更新另一个 NSDate 类型的属性绝对没问题。

谁能帮我弄清楚我做错了什么或者我应该做些什么来完成这项工作。

最好的问候 托莫

【问题讨论】:

    标签: ios key-value-observing


    【解决方案1】:

    也许我在你的问题中遗漏了一些东西,但你可以像观察其他类型一样容易地观察类型 int 的属性,而无需做任何特别的事情。

    尝试删除您的 +automaticallyNotifiesObserversForKey: 覆盖和您的 -setSampleValue: 设置器,然后合成 sampleValue 的访问器:

    @synthesize sampleValue;
    

    int 是键 @"sampleValue" 对应的值的类型,但它不是被观察到的东西。正在观察的对象是dc,它会在sampleValue 属性发生更改时发送适当的通知。

    【讨论】:

    • 谢谢迦勒。我想我是在猜测 int 不支持 KVO,因为我无法使其发挥作用。我删除了你提到的那些没有帮助的方法。接下来我添加了自我。在要观察的属性前面,所以它现在有 self.sampleValue = ... 这使它工作。现在,当 sampleValue 更新时,我的观察者对象中会收到一条消息。
    • 我自己想出来的。对不起,打扰了。无论如何感谢您的贡献。
    • 对——你需要设置sampleValue属性,而不是对应的实例变量。将导致发送消息的是属性设置器。这意味着你需要写self.sampleValue = ...[self setSampleValue:...]
    • @user1152964:您仍应将 Calebs 的答案标记为已接受,以便将该问题标记为已关闭。答案是正确的:)
    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多