objective-c - 我如何接收 cocoa 绑定(bind)值已更改的通知?

标签 objective-c cocoa nsuserdefaults cocoa-bindings

我刚刚学习 Cocoa Bindings,但遇到了障碍。有没有办法在绑定(bind)的值发生变化时调用方法?

示例:

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

最佳答案

您可以使用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 的。

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

关于objective-c - 我如何接收 cocoa 绑定(bind)值已更改的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669902/

相关文章:

arrays - 将 tableView 内容保存到 NSUserDefaults Swift

ios - 如何在 UserDefault 中存储推送通知警报消息?

iphone - 了解 iOS 6 界面方向变化

iphone - 以编程方式暂停 mpmovieplayercontroller - 可能吗?

cocoa - 将同一个表的两列绑定(bind)到两个不同的 NSArrayController 会产生奇怪的结果

objective-c - 我绑定(bind)的对象的作用是什么?

swift - NSUserDefaults 的特殊字典

iOS 11,Xcode 9 错误 : NSURLConnection finished with error - code -1009

objective-c - 如何根据动态需求动态/无限地创建 UIImageViews?

objective-c - 如何在 NSMutableArray 中存储两个字段?