Eimantas
Eimantas

Reputation: 49354

Key Value Observing and NSButton state

I'm trying to observe checkbox status and make appropriate changes in the app when checkbox status changes. In a window manager that manages the window with checkbox I have following observer setup:

- (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);
}

I also have wired up myCheckBox to file owner (which is window controller) to appropriate checkbox in the window. However when I run my app observeValueForKeyPath:ofObject:change:context: method is never called.

What am I doing wrong?

Upvotes: 4

Views: 5374

Answers (2)

Nathan Kinsinger
Nathan Kinsinger

Reputation: 25041

In -awakeFromNib check that myCheckbox is not nil. If it's nil then it's not connected properly in IB.

Edit: NSButton.state has the same value as NSButton.cell!.state, but it isn't Key-Value Observable. To be able to observe the value, you'll need to use the \.cell!.state key path.

Upvotes: 9

Jon Hess
Jon Hess

Reputation: 14247

Unless documented to be Key Value Observing compliant, you should not expect the accessors of a given class to implement KVO support.

Buttons do implement key value binding, so instead of observing the state property you might bind one of your boolean attributes to the button's value binding.

Upvotes: 2

Related Questions