Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 键值观察和按钮状态_Cocoa_Key Value Observing_Nsbutton - Fatal编程技术网

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中尝试执行此操作时,无法使用
单元格。状态
,绑定到按钮的
单元格
上的
状态
,就成功了。