2015-06-08 1 views
1

У меня есть два компонента пользовательского интерфейса, значения которых синхронизируются по умолчанию пользователя. Первый - по существу поле ввода, другое - пункт меню. Когда изменяется значение поля ввода, ключ эквивалент пункта меню изменяется через Cocoa привязки:Связывание какао не считывает значение nil из пользовательских значений по умолчанию

Input Field -> NSUserDefaultsController -> User Defaults 
User Defaults -> NSUserDefaultsController -> Menu Item 

Это отлично работает для всего, кроме значения nil. По какой-то причине я не могу сохранить фактическое значение nil в пользовательских значениях по умолчанию, вместо этого я использую пустой словарь. С другой стороны, которая считывает значение, у меня есть трансформатор, который «раздувает» пустой словарь в значение nil.

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

Что я делаю неправильно?

ответ

0

То, что я делал неправильно, было осуществлением привязки к пункту меню в качестве взлома. Я представил keyCombo недвижимости через категорию:

@interface NSMenuItem (Combo) 
@property(assign, nonatomic) MASShortcut *keyCombo; 
@end 

Это свойство, которое получает связано с пользователем по умолчанию. Тогда, так как я не мог легко добавить переменный экземпляр в категории, я просто вернулся nil в поглотителе:

@implementation NSMenuItem (Combo) 

- (MASShortcut*) keyCombo 
{ 
    return nil; 
} 

/* setter omitted */ 

@end 

Это работало хорошо, пока я не хотел, чтобы установить свойство nil через привязки. Поскольку геттер всегда возвращался nil, механизм привязки какао думал, что нет необходимости обновлять значение свойства, поскольку оно, казалось, уже было nil.