Как зарегистрировать пользовательские значения по умолчанию с помощью NSUserDefaults без перезаписи существующих значений?

StackOverflow https://stackoverflow.com/questions/2076816

Вопрос

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

Это было полезно?

Решение

Из документации для -registerDefaults: (курсив мой добавлен):

Содержимое регистрационного домена не записывается на диск; вам нужно вызывать этот метод каждый раз при запуске вашего приложения.Вы можете поместить файл plist в каталог ресурсов приложения и вызвать registerDefaults:с содержимым, которое вы прочитали из этого файла.

Итак, ваш код был на правильном пути.Вот как вы регистрируете значения по умолчанию.

Обычно я использую это в -applicationDidFinishLaunching::

// Load default defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];

Использование plist упрощает добавление и изменение значений по умолчанию в вашем приложении и предотвращает ошибку при использовании @"NO" тоже как ценность.

Редактировать: Быстрый 3 вариант:

 UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top