Как зарегистрировать пользовательские настройки по умолчанию, используя NSUserDefaults, не перезаписывая существующие значения? - PullRequest
33 голосов
/ 16 января 2010

У меня есть класс 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 Ответ

75 голосов
/ 16 января 2010

Из документации на -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])
...