web-dev-qa-db-fra.com

À quoi sert - [NSUserDefaults registerDefaults:]?

Quelle est la différence entre:

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

Et ça:

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

La différence est que le premier extrait de code que vous enregistrez par défaut sera utilisé lorsque l'utilisateur n'a apporté aucune modification à la "propriété".

Donc, si vous voulez fournir disons une "propriété" avec le nom de clé "Message de bienvenue", vous pourriez au lieu d'avoir la propriété renvoyant nil insérer un message par défaut "Bienvenue pour la première fois" qui s'affichera s'il n'y a pas eu modifications apportées à la propriété.

Cela simplifiera votre logique car vous n'avez pas besoin d'écrire un test if pour vérifier si la "propriété" retourne nil et ensuite faire un autre message si c'est le cas.

NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"];

if(greeting == nil) {
    NSLog(@"Welcome first-time user!");
}

Le deuxième extrait de code que vous avez publié sert à définir la propriété sur une autre valeur. Vous aurez différentes méthodes set (setString, setObject, setBoolean) pour définir des valeurs en fonction de l'état de votre programme dans les Userdefaults.

EDIT ----- Mises à jour comme demandé dans le commentaire.

La première méthode consiste à enregistrer des valeurs par défaut, comme son nom l'indique. La première fois que vous accédez à la propriété avec un nom de clé, la valeur sera nulle pour les objets, false pour les booléens ou 0 pour les nombres. Au lieu de faire beaucoup de tests et ainsi de suite, donc si les valeurs ne sont pas définies dans le programme, puis effectuez une action "par défaut" telle que l'exemple ci-dessus, vous pouvez expédier votre application avec des valeurs déjà prédéfinies pour ces clés.

Un endroit typique pour mettre les registerDefaults est dans la méthode d'initialisation dans l'appDelegate.

Ensuite, quelque part dans votre programme, vous voudrez peut-être définir les valeurs de ces champs, puis vous utilisez setObject, setString, setBoolean ... et pour la récupération, vous utilisez stringForKey, objectForKey ...

Considérez-le comme ceci

Le registerDefaults est le constructeur où vous pouvez fournir des valeurs sensibles pour l'objet, sinon vous obtenez des valeurs par défaut que j'ai déjà écrites. Ensuite, plus tard, si vous souhaitez modifier les attributs de l'objet, vous n'utilisez PAS le "constructeur" mais les méthodes set/get.

82
LuckyLuke

Longue histoire courte,

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

enregistrera "Entropy" dans un fichier nommé com.example.Demo.plist dans le dossier Library/Preference (où com.example.Demo est votre ID de bundle, voir 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"]);

affichera "Mac OS X", "Google", (null)

En fait, registerDefaults

  • ne sauvegarde pas sur le disque
  • définit uniquement la valeur des clés qui n'ont pas été définies ("kOS" est défini par setObject:forKey: et "kSearchEngine" n'est pas défini)
  • renvoie 0 pour les valeurs scalaires, nil pour les objets si cette clé n'est pas définie à la fois par registerDefaults et setObject:forKey: ("kBrowser" dans ce cas)

Et l'utilisation de registerDefaults

Extrait de Guide de programmation des préférences et paramètres

Si ces valeurs par défaut standard ne conviennent pas à votre application, vous pouvez enregistrer vos propres valeurs par défaut à l'aide de la méthode registerDefaults :. Cette méthode place vos valeurs par défaut personnalisées dans le domaine NSRegistrationDomain, ce qui entraîne leur retour lorsqu'une préférence n'est pas explicitement définie.

Cité de Comment enregistrer des données avec NSUserDefaults

Une autre astuce est que vous pouvez initialiser vos NSUserDefaults avec un objet NSDictionary prédéfini. Ainsi, par exemple, vous pouvez définir une valeur par défaut sur "false" ou "true" avant que l'utilisateur n'ait jamais eu la possibilité d'interagir avec votre programme. Dans mon cas, parfois je crée un tableau qui représente tous les niveaux de mon jeu, et dans chaque valeur de tableau, je stocke un booléen pour vérifier si un joueur a terminé le niveau. Pour ce faire, je crée l'objet de données puis l'enregistre auprès de NSUserDefaults. Si une valeur précédente existe pour l'objet, rien ne se produit. Sinon, mon objet vide est enregistré comme valeur par défaut "par défaut"

PS: Ole a un très bon article expliquant Gestion des valeurs par défaut avec NSUserDefaults en détail

31
onmyway133

Une autre façon de voir les choses est la suivante. Si vous supprimez le fichier de préférences de ~/Library/Preferences, les valeurs par défaut définies par registerDefaults seront celles qui s'appliqueront à l'application jusqu'à ce que de nouvelles préférences soient définies.

10
Abizern

Dans Swift 2.1.1 Xcode 7.2

J'ai ajouté cet extrait à l'application: didFinishLaunchingWithOptions pour initialiser le tintColorsIndex qui est l'un des paramètres que l'utilisateur peut changer dans l'application.

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

Lorsque l'application est lancée la toute première fois, tintColorsIndex se verra attribuer une valeur de -1 (un Int). Si l'utilisateur a changé de couleur lors de l'utilisation de l'application, sa préférence ne sera pas remplacée lors des lancements suivants.

3
Jervisbay

Les valeurs par défaut de l'utilisateur sont regroupées en domaines ... registerDefaults est utilisé pour ajouter des valeurs par défaut au domaine d'enregistrement.

Vous pouvez lire sur les domaines dans Guide de programmation des préférences et paramètres .

1
Swapnil Luktuke