Первое: ответ @ keeluu должен быть помечен как правильный.
Программно
Если вы делаете это в коде, а не через IB, есть «недоработка», на которую стоит обратить внимание. Это выглядит так:
// Assume 'anObjectController' is an NSObjectController.
// Assume 'userDefaultsController' is [NSUserDefaultsController sharedUserDefaultsController]
// Assume 'someDictionary' is an NSDictionary in userDefaults.
[self.anObjectController
bind:NSContentBinding
toObject:userDefaultsController
withKeyPath:@"values.someDictionary"
options:@{NSHandlesContentAsCompoundValueBindingOption: @YES}];
Если вы сделаете вышеупомянутое, вы обнаружите, что, когда вы привязываете свои элементы пользовательского интерфейса к свойствам в someDictionary
, эти элементы пользовательского интерфейса будут правильно отображать значения, которые являются пользовательскими по умолчанию, но когда вы их изменяете (скажем, щелкнув связанный флажок) эти значения НЕ будут обновляться по умолчанию; старые ценности держатся.
Причина
Привязка должна быть NSContentObjectBinding
вместо NSContentBinding
. Класс NSObjectController предоставляет привязку с именем contentObject
. Когда вы привязываетесь к этому, все работает правильно.
Это простая ошибка, потому что завершение кода XCode автоматически идет на NSContentBinding
, и в любом случае это одно из наиболее часто используемых имен привязки. Это стоило мне нескольких часов хлопот, так что, надеюсь, я спас кого-то еще.