Наблюдение за ключевыми значениями и состояние NSButton

Я пытаюсь наблюдать за состоянием флажка и вносить соответствующие изменения в приложение при изменении статуса флажка. В оконном менеджере, который управляет окном с флажком, у меня есть следующая настройка наблюдателя:

- (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: никогда не вызывается.

Что я делаю не так?


person Eimantas    schedule 11.07.2010    source источник


Ответы (2)


В -awakeFromNib проверьте, что myCheckbox не равно нулю. Если он равен нулю, значит он неправильно подключен в IB.

Изменить: NSButton.state имеет то же значение, что и NSButton.cell!.state, но не является наблюдаемой парой "ключ-значение". Чтобы иметь возможность наблюдать за значением, вам нужно использовать ключевой путь \.cell!.state.

person Nathan Kinsinger    schedule 11.07.2010
comment
Это не ноль. Это дает мне экземпляр NSButton. awakeFromNib вызывается, когда все объекты в nib разархивированы и их соединения уже установлены. - person Eimantas; 11.07.2010
comment
Даже если кажется, что cell.state работает, я не верю, что NSButtonCell задокументирован как совместимый с KVO для состояния во всех случаях. NSCell может представлять значения с помощью многих методов доступа: setObjectValue:, setStringValue:, setIntegerValue:, setState: ... Наблюдение за integerValue и изменение objectValue не приведет к уведомлению KVO, но integerValue изменится. - person Jon Hess; 11.07.2010
comment
Может показаться, что вы получаете все уведомления, которые вам нужны, с этим соблюдением, но вы работаете вне контракта API NSButtonCell и можете сломаться в будущем или при других обстоятельствах, которые изменяют состояние кнопки, чем простой setState: вызов. - person Jon Hess; 11.07.2010
comment
Я хочу проголосовать за это 1000 раз, спасибо, что обратили внимание на cell.state! Хотя попытка сделать это в Swift не работала с cell.state, привязка к state на кнопке cell помогла. - person Ian Bytchek; 11.01.2016

Если документально не подтверждено соответствие Key Value Observing, не следует ожидать, что средства доступа данного класса реализуют поддержку KVO.

Кнопки реализуют привязку значения ключа, поэтому вместо наблюдения за свойством состояния вы можете привязать один из своих логических атрибутов к привязке значения кнопки.

person Jon Hess    schedule 11.07.2010