如何收到可可绑定值已更改的通知?

时间:2012-12-02 13:52:22

标签: objective-c cocoa nsuserdefaults cocoa-bindings

我只是在学习Cocoa Bindings,但我遇到了麻烦。有没有办法在绑定的值发生变化时调用方法?

示例:

我将NSStepper绑定到NSUserDefaults以设置int,但是我需要能够在更改int时更新其他一些内容。有没有办法直接从对象控制器接收通知?或者我应该以某种方式观察NSStepper
如果是这样,我该怎么做?当它已经束缚时,IB似乎并不喜欢我搞乱它。

2 个答案:

答案 0 :(得分:4)

您可以使用Key Value Observing (KVO)直接观察NSUserDefaults。注册以下通知:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults addObserver:self forKeyPath:@"YourUserDefaultsKey" options:0 context:NULL];

然后实现它,只要@"YourUserDefaultsKey"的值发生变化,就会调用它:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    if (object == userDefaults && [keyPath isEqualToString:@"YourUserDefaultsKey"]) {
        int intValue = [userDefaults intValueForKey:@"YourUserDefaultsKey"];
        // Do whatever you need to do with new intValue
    }
}

最后,不要忘记在适当的地方取消注册(例如在-dealloc中):

- (void)dealloc
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults removeObserver:self forKeyPath:@"YourUserDefaultsKey"];
}

请注意,Cocoa Bindings本身基于KVO。

免责声明:我在浏览器中输入了此答案中的所有代码。它应该是正确的,但可能有一两个错字。

答案 1 :(得分:0)

如果您还记得通知,通知中心,观察员,@ selector:,那么您的工作就完成了。

编辑:

你可以通过它的类来观察int的变化。它取决于你,你如何实现它,虽然IB或通过代码。