Como registrar padrões do usuário usando NSUserDefaults sem replace os valores existentes?

Eu tenho uma class AppDelegate com +(void)initialize método que eu uso para registrar alguns padrões. Aqui está o código que eu uso:

 + (void)initialize { NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; } 

Também criei o Preferences.xib, que contém algumas checkboxs de seleção ( NSButton ) que exibem o status das preferências. Eles estão ligados ao NSUserDefaultsController com as mesmas chaves (fooKey e barKey neste caso). Cada vez que eu lanço um aplicativo e mudo os “defaults” eles são restaurados no próximo lançamento do aplicativo.

Existe uma maneira de registrar “padrões padrão” sem sobrescrever valores já existentes? Talvez cada vez que eu construo e inicio um aplicativo seu arquivo de preferências esteja sendo recriado? Talvez eu deva desvincular checkboxs de seleção de NSUserDefaultsController e manter os valores das chaves eu mesmo com algum código customizado no controller de janela de preferências?

Eu gostaria de ouvir sua implementação de escolha para manter os padrões do usuário.

Estou usando o Mac OS X 10.6.2 e o XCode 3.2.1

Na documentação para -registerDefaults: (ênfase adicionada):

O conteúdo do domínio de registro não é gravado no disco; você precisa chamar esse método sempre que seu aplicativo for iniciado . Você pode colocar um arquivo plist no diretório Resources do aplicativo e chamar registerDefaults: com o conteúdo que você leu desse arquivo.

Então o seu código estava no caminho certo. É assim que você registra os padrões padrão.

Eu costumo usar isso em -applicationDidFinishLaunching: :

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

Usar um plist facilita a adição e a alteração de padrões no seu aplicativo, além de impedir que você cometa o erro de usar @"NO" como um valor também.

Edit: Swift 3 variante:

  UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])