我只是在学习 Cocoa Bindings,但遇到了障碍。当绑定的值发生变化时,有没有办法调用方法?
例子:
我正在绑定一个NSStepper
toNSUserDefaults
来设置一个 int,但是当 int 改变时我需要能够更新一些其他的东西。有没有办法直接从对象控制器接收通知?或者我应该以某种方式观察NSStepper
?
如果是这样,我该怎么做?IB 似乎不喜欢我在它已经绑定时弄乱它。
我只是在学习 Cocoa Bindings,但遇到了障碍。当绑定的值发生变化时,有没有办法调用方法?
例子:
我正在绑定一个NSStepper
toNSUserDefaults
来设置一个 int,但是当 int 改变时我需要能够更新一些其他的东西。有没有办法直接从对象控制器接收通知?或者我应该以某种方式观察NSStepper
?
如果是这样,我该怎么做?IB 似乎不喜欢我在它已经绑定时弄乱它。
您可以使用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
}
}
最后,不要忘记在适当的地方(例如 in -dealloc
)取消注册为观察者:
- (void)dealloc
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults removeObserver:self forKeyPath:@"YourUserDefaultsKey"];
}
请注意,Cocoa Bindings 本身是基于 KVO 的。
免责声明:我在浏览器中输入了此答案中的所有代码。它应该是正确的,但可能有一两个错字。
如果你还记得 Notifications、通知中心、观察者、@selector:,那么你的工作就完成了。
编辑:
你可以通过它的类来观察int的变化。通过 IB 或通过代码如何实现它取决于您。