2010-01-16 7 views
33

J'ai une classe AppDelegate avec la méthode +(void)initialize que j'utilise pour enregistrer certaines valeurs par défaut. Voici le code que j'utilise:Comment enregistrer les valeurs par défaut utilisateur en utilisant NSUserDefaults sans écraser les valeurs existantes?

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

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

J'ai aussi créé Preferences.xib qui contient deux cases à cocher (NSButton) que l'état d'affichage des préférences. Ils sont liés à NSUserDefaultsController avec les mêmes clés (fooKey et barKey dans ce cas). Chaque fois que je lance une application et change les "par défaut", ils sont restaurés au prochain lancement de l'application.

Existe-t-il un moyen d'enregistrer les "valeurs par défaut" sans écraser les valeurs déjà existantes? Peut-être que chaque fois que je construis et lance une application, son fichier de préférences est en train d'être recréé? Peut-être que je devrais découpler les cases à cocher de NSUserDefaultsController et de maintenir les valeurs des clés moi-même avec du code personnalisé dans le contrôleur de fenêtre de préférences?

Je voudrais entendre votre implémentation de choix pour la gestion des valeurs par défaut.

J'utilise Mac OS X 10.6.2 et Xcode 3.2.1

+0

Assurez-vous que les cases à cocher sont liés à "contrôleur Paramètres par défaut partagé", clé du contrôleur "valeurs", le modèle des chemins clés "fooKey"/"Barkey". Sinon, votre code me va bien. – Costique

+5

'@" NO "' n'est pas un littéral booléen; c'est un littéral de chaîne pour le mot "NON". Vous devriez utiliser '[NSNumber numberWithBool: NO]'; sinon, les valeurs dans les valeurs par défaut de l'utilisateur ne seront pas des booléens. –

+0

Non, ils ne seront pas, mais si je les lis comme BOOLs - ils le feront. Extrait du livre de Daniel H Steinberg "Cocoa Programming" (pragprog.com): En fait, vous n'avez pas besoin d'être aussi explicite lorsque vous placez le BOOL dans le dictionnaire. Vous pouvez passer la valeur YES ou NO sous forme de chaîne et créer un BOOL à partir de cette valeur lorsque vous lisez les préférences. – Eimantas

Répondre

75

De la documentation -registerDefaults: (nous soulignons):

Le contenu du domaine d'enregistrement ne sont pas écrites sur le disque ; vous devez appeler cette méthode chaque fois que votre application démarre. Vous pouvez placer un fichier plist dans le répertoire Resources de l'application et appeler registerDefaults: avec le contenu que vous lisez dans ce fichier.

Votre code était donc sur la bonne voie. C'est ainsi que vous enregistrez les valeurs par défaut.

Je l'utilise habituellement dans -applicationDidFinishLaunching::

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

L'utilisation d'un plist, il est facile d'ajouter et de modifier les valeurs par défaut dans votre application, et il vous empêche de faire l'erreur d'utiliser @"NO" comme une valeur trop.

Edit: Swift 3 variante:

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

Johan - merci pour l'ouverture des yeux. J'ai revérifié l'appel et il semble que cela fonctionne sans aucune déclaration if! – Eimantas

+0

Est-ce que votre code "Charger les paramètres par défaut" ci-dessus peut être utilisé avec le groupe de paramètres? Par exemple, puis-je utiliser le fichier Root.plist pour initialiser mes paramètres par défaut? – Ricky

+0

Oui, bien que votre ensemble de paramètres puisse être chargé avant le lancement de votre application. Vous pouvez donc également définir les paramètres par défaut initiaux dans les paramètres. La méthode '-registerDefaults:' ne remplacera pas les préférences définies via un ensemble de paramètres. –

Questions connexes