Как зарегистрировать пользовательские значения по умолчанию, используя NSUserDefaults, без перезаписывания существующих значений?
У меня есть класс AppDelegate с методом +(void)initialize
, который я использую для регистрации некоторых значений по умолчанию. Вот код, который я использую:
+ (void)initialize {
NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}
Я также создал Preferences.xib, который содержит пару флажков (NSButton
), которые отображают статус предпочтений. Они привязаны к NSUserDefaultsController
с теми же ключами (fooKey и barKey в этом случае). Каждый раз, когда я запускаю приложение и изменяю "значения по умолчанию", они восстанавливаются при следующем запуске приложения.
Есть ли способ зарегистрировать "значения по умолчанию по умолчанию" без перезаписи уже существующих значений? Может быть, каждый раз, когда я создаю и запускаю приложение, его файл настроек воссоздается? Может быть, мне нужно отменить привязку флажков от NSUserDefaultsController
и самостоятельно сохранить значения ключей с помощью какого-либо настраиваемого кода в окне контроллера окон?
Я хотел бы услышать вашу реализацию выбора для поддержания пользовательских настроек по умолчанию.
Я использую Mac OS X 10.6.2 и XCode 3.2.1
Ответы
Ответ 1
Из документации для -registerDefaults:
(выделено мной):
Содержимое домена регистрации не записывается на диск; вам нужно вызывать этот метод каждый раз, когда ваше приложение запускается. Вы можете поместить файл plist в каталог ресурсов приложения и вызвать registerDefaults: с содержимым, которое вы читаете в этом файле.
Итак, ваш код был на правильном пути. Таким образом вы регистрируете значения по умолчанию по умолчанию.
Я обычно использую это в -applicationDidFinishLaunching:
:
// Load default defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];
Использование plist упрощает добавление и изменение значений по умолчанию в вашем приложении, и это мешает вам ошибиться при использовании @"NO"
в качестве значения.
Изменить: вариант Swift 3:
UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])