Cocoa 键值观察和按钮状态
我试图观察复选框状态,并在复选框状态更改时在应用程序中进行适当的更改。在使用复选框管理窗口的窗口管理器中,我有以下观察者设置:Cocoa 键值观察和按钮状态,cocoa,key-value-observing,nsbutton,Cocoa,Key Value Observing,Nsbutton,我试图观察复选框状态,并在复选框状态更改时在应用程序中进行适当的更改。在使用复选框管理窗口的窗口管理器中,我有以下观察者设置: - (void)awakeFromNib { [myCheckBox addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
- (void)awakeFromNib
{
[myCheckBox addObserver:self
forKeyPath:@"state"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];
}
- (void)dealloc
{
[myCheckBox removeObserver:self forKeyPath:@"state"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"KeyPath: %@", keyPath);
NSLog(@"ofObject: %@", object);
NSLog(@"change: %@", change);
}
我还将myCheckBox连接到文件所有者(即窗口控制器)和窗口中相应的复选框。但是,当我运行我的应用程序时,从未调用observeValueForKeyPath:ofObject:change:context:方法
我做错了什么?在
-awakeFromNib
中检查myCheckbox
是否为零。如果它为零,那么它在IB中没有正确连接
编辑:
NSButton.state
与NSButton.cell!具有相同的值!。状态
,但它不是可观察的键值。要能够观察该值,您需要使用\.cell!。状态
键路径。除非记录为符合键值观察,否则不应期望给定类的访问器实现KVO支持
按钮确实实现了键值绑定,因此您可以将一个布尔属性绑定到按钮的值绑定,而不必观察state属性。它不是nil。它给了我一个NSButton的例子。当nib中的所有对象都未归档且它们的连接已建立时,将调用awakeFromNib。即使cell.state似乎正常工作,我也不认为NSButtonCell在所有情况下都符合KVO的“状态”。NSCell可以通过许多访问器来表示值:setObjectValue:、setStringValue:、setIntegerValue:、setState:。。。观察integerValue和修改objectValue不会导致KVO通知,但integerValue会发生更改。您可能会通过此观察获得所需的所有通知,但您的工作不在NSButtonCell的API合同范围内,并且可能会在将来或其他情况下中断,这些情况会改变按钮的状态,而不是简单的setState:call。我想将此项提高1000次,感谢您在
单元格中指出。state
!在Swift中尝试执行此操作时,无法使用单元格。状态
,绑定到按钮的单元格
上的状态
,就成功了。