Como registrar os padrões do usuário usando o NSUSERDefaults sem substituir os valores existentes?
-
21-09-2019 - |
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
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])