Когда вы используете привязки Какао к общим пользовательским настройкам по умолчанию для NSMenuItem, вам следует прекратить использовать селектор для NSMenuItem и вместо этого использовать наблюдение значения ключа, чтобы определить, когда значение изменилось, и затем действовать соответствующим образом.
В этом примере у меня есть useTransparency
имя значения, с которым связан NSMenuItem. В инициализации моего контроллера я регистрируюсь, чтобы получать обновления для этого значения:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults addObserver:self
forKeyPath:@"useTransparency"
options:NSKeyValueObservingOptionNew
context:NULL];
Затем я реализую метод наблюдателя:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
NSLog(@"KVO: %@ changed property %@ to value %@", object, keyPath, change);
if ([keyPath compare:@"useTransparency"] == NSOrderedSame)
{
BOOL isTransparent = [[change valueForKey:@"new"] boolValue];
[self setTransparency:isTransparent];
}
}
В частности, я вообще не связываю селектор для NSMenuItem - я просто позволяю наблюдению ключ-значение делать свою работу. Если вы привязываетесь к селектору, вы сталкиваетесь с проблемой попытки угадать, когда значение изменится в зависимости от срабатывания селектора. Избегайте всей этой проблемы, просто используя систему привязок, а не их комбинацию.