Como registrar os padrões do usuário usando o NSUSERDefaults sem substituir os valores existentes?

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

Pergunta

Eu tenho uma aula de 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];
}

Eu também criei preferências.xib que contém algumas caixas de seleção (NSButton) Esse status de exibição de preferências. Eles estão vinculados a NSUserDefaultsController com as mesmas chaves (fookey e barkey neste caso). Cada vez que inicio um aplicativo e altero os "padrões", eles são restaurados no lançamento do próximo aplicativo.

Existe uma maneira de registrar "padrão padrão" sem sobrescrever valores já existentes? Talvez cada vez que eu construo e inicie um aplicativo, seu arquivo de preferências está sendo recriado? Talvez eu deva desbloquear as caixas de seleção de NSUserDefaultsController e manter os valores das chaves com algum código personalizado no controlador de janela de preferências?

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

Estou usando o Mac OS X 10.6.2 e Xcode 3.2.1

Foi útil?

Solução

Da documentação para -registerDefaults: (enfase adicionada):

O conteúdo do domínio de registro não é gravado no disco; Você precisa chamar esse método cada vez que seu aplicativo inicia. Você pode colocar um arquivo PLIST no diretório de recursos do aplicativo e ligar para o RegisterDefaults: com o conteúdo que você lê desse arquivo.

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

Eu costumo usar isso em -applicationDidFinishLaunching::

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

O uso de um plist facilita a adição e a alteração dos padrões em seu aplicativo, e isso impede que você coma o erro de usar @"NO" como um valor também.

Editar: Swift 3 variante:

 UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top