Qual é o uso de – ?

Qual é a diferença entre:

[[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]]; 

E isto:

 [[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"]; 

A diferença é que o primeiro trecho de código você registra os padrões que serão usados ​​quando o usuário não fez nenhuma alteração na “propriedade”.

Então, se você quiser fornecer, digamos que uma “propriedade” com o nome da chave “Mensagem de boas-vindas”, você poderia, em vez de ter a propriedade retornando nil, inserir uma mensagem padrão ‘Welcome first-time user’ que será exibida quando não houver alterações na propriedade.

Isso simplificará sua lógica porque você não precisa escrever um teste if para verificar se a “propriedade” retorna nil e, em seguida, criar outra mensagem, se for esse o caso.

 NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"]; if(greeting == nil) { NSLog(@"Welcome first-time user!"); } 

O segundo trecho de código que você postou é para definir a propriedade para outro valor. Você terá diferentes methods de set (setString, setObject, setBoolean) para definir valores dependendo do estado do seu programa nos Userdefaults.

EDITAR —– Atualizações conforme solicitado no comentário.

O primeiro método é para registrar valores nos padrões, como o nome indica. Na primeira vez que você acessar a propriedade com algum nome de chave, o valor será nulo para objects, falso para booleanos ou 0 para números. Em vez de fazer muitos testes, e assim por diante, se os valores não estiverem definidos no programa e, em seguida, executar alguma ação “padrão”, como o exemplo acima, você poderá enviar seu aplicativo com alguns valores já predefinidos para essas chaves.

Um lugar típico para colocar o registerDefaults está no método initializer no appDelegate.

Então, em algum lugar do seu programa você pode querer definir os valores desses campos, então você usa o setObject, setString, setBoolean … e para recuperar você usa stringForKey, objectForKey …

Pense nisso como isso

O registerDefaults é o construtor onde você pode fornecer valores sensíveis para o object, caso contrário, você obtém alguns padrões que eu já escrevi. Então, mais tarde, se você quiser alterar os atributos do object, você NÃO usará o “construtor”, mas os methods set / get.

Longa história curta,

 [[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"] 

salvará “Entropy” em um arquivo chamado com.example.Demo.plist na pasta Library / Preference (onde com.example.Demo é seu ID de pacote, consulte IOS Application Security Part 20 – Local Data Storage )

 [[NSUserDefaults standardUserDefaults] setObject:@"Mac OS X" forKey:@"kOS"]; NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys: @"Windows", @"kOS", @"Google", @"kSearchEngine", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kOS"]); NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kSearchEngine"]); NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kBrowser"]); 

imprimirá “Mac OS X”, “Google”, (null)

De fato, registerDefaults

  • não salva no disco
  • define apenas valores para chaves que não foram definidas (“kOS” é definido por setObject:forKey: e “kSearchEngine” não está definido)
  • retorna 0 para valores escalares, nada para objects se essa chave não for definida por ambos registerDefaults e setObject:forKey: (“kBrowser” neste caso)

E o uso de registerDefaults

Citado em Preferências e configurações Guia de programação

Se esses valores padrão não forem apropriados para seu aplicativo, você poderá registrar seus próprios valores padrão usando o método registerDefaults:. Esse método coloca seus valores padrão personalizados no domínio NSRegistrationDomain, o que faz com que eles sejam retornados quando uma preferência não é explicitamente definida.

Citado de Como salvar dados com NSUserDefaults

Outra dica é que você pode inicializar seus NSUserDefaults com um object NSDictionary pré-definido. Por exemplo, você pode definir um valor padrão como “falso” ou “verdadeiro” antes que o usuário tenha a chance de interagir com seu programa. No meu caso, às vezes eu crio uma matriz que representa todos os níveis do meu jogo, e em cada valor de array eu armazeno um booleano para verificar se um jogador terminou o nível. Para fazer isso, crio o object de dados e, em seguida, registro-o com NSUserDefaults. Se um valor anterior existir para o object, nada acontece. Caso contrário, meu object em branco será salvo como os padrões “padrão”

PS: Ole tem um artigo muito bom explicando Manipulando valores padrão com NSUserDefaults em detalhes

Outra maneira de olhar é isso. Se você excluir o arquivo de preferências de ~ / Library / Preferences, os padrões definidos por registerDefaults serão aqueles que se aplicam ao aplicativo até que novas preferências sejam configuradas.

No Swift 2.1.1 Xcode 7.2

Eu adicionei este trecho ao aplicativo: didFinishLaunchingWithOptions para inicializar o tintColorsIndex, que é um dos parâmetros que o usuário pode alterar no aplicativo.

  let defaults = NSUserDefaults.standardUserDefaults() defaults.registerDefaults([ "tintColorsIndex" : -1, ]) 

Quando o aplicativo é iniciado na primeira vez em que o tintColorsIndex será atribuído um valor de -1 (um Int). Se o usuário mudou a cor ao usar o aplicativo, sua preferência não será substituída em lançamentos subseqüentes.

Padrões do usuário são agrupados em domínios … registerDefaults é usado para adicionar padrões ao domínio de registro.

Você pode ler sobre os domínios no Guia de Programação de Preferências e Configurações .