Initialiser les NSUserDefaults

WIMPWIMP Membre
17:59 modifié dans API AppKit #1
Bonjour à  tous,

J'utilise quelques parametres numériques, que j'affiche et modifie via des NSTextView.
Je souhaite les enregistrer comme NSUserDefaults.
Pour cela les NSTextView ont pour target une IBAction qui contient:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

attackFactor = [[sender cellAtRow:0 column:0] floatValue];
defenseFactor = [[sender cellAtRow:1 column:0] floatValue];

[prefs setFloat:attackFactor forKey:@attack];
[prefs setFloat:defenseFactor forKey:@defense];

Au lancement du programme les NSUserDefaults ont été initialisés par:

+(void)initialize
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *defs = [NSMutableDictionary dictionary];
[prefs setFloat:0.1 forKey:@attack];
[prefs setFloat:0.01 forKey:@defense];

[prefs registerDefaults:defs];
}

Si le fichier de préférences est déjà  créé et que je supprime initialize, tout se passe bien.
J'avais cru comprendre qu' une fois les préférences crées dans le dossier users/name/library/preferences, +(void)initialize était sans effet.
Hors à  chaque appel initialize s'exécute et écrase les préférences que j'avais enregistré
(j'ai vérifié dans property list editor  qu'elles étaient bien enregistrées).

Ce qui est bizarre c'est que j'ai utilisé la même méthode (en plus complexe) dans "Fractales 2.0" pour enregistrer les palettes de couleurs, et que ça marche bien: mes palettes utilisateurs ne sont jamais écrasées.

Donc ma question est: quel est le comportement correct ? Si c'est l'écrasement, il va falloir qe je comprenne pourquoi Fractales marche si bien...Il faut bien trouver un moyen d'initialiser les préférences utilisateur.

Merci de vos lumières.

PS: je viens de regarder le topic de Macvelotte sur la question, et j'en conclus qu'il ne devrait pas y avoir écrasement...

Réponses

  • ChachaChacha Membre
    17:59 modifié #2
    dans 1124194001:

    Bonjour à  tous,

    +(void)initialize
    {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary *defs = [NSMutableDictionary dictionary];
    [prefs setFloat:0.1 forKey:@attack];
    [prefs setFloat:0.01 forKey:@defense];

    [prefs registerDefaults:defs];
    }


    T'y t'es trompé !
    Regarde ce que tu fais : tu crées un dictionnaire dont tu ne fais rien (defs), et tu "set" les défauts, donc oui tu les écrases.
    Le code correct est:
    <br />+(void)initialize<br />{<br />	NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];<br />	NSMutableDictionary *defs = [NSMutableDictionary dictionary];<br />      //c&#39;est defs qu&#39;il faut remplir !<br />	[defs setObject:[NSNumber numberWithFloat:0.1] forKey:@&quot;attack&quot;];<br />	[defs setObject:[NSNumber numberWithFloat:0.01]forKey:@&quot;defense&quot;];<br />	[prefs registerDefaults:defs];<br />}<br />
    


    +
    Chacha
  • WIMPWIMP Membre
    17:59 modifié #3
    Chacha tu es le meilleur! Merci pour ton diagnostic
    ça m'apprendra à  recopier du code sans faire attention à  bien le comprendre B)

    WIMP
Connectez-vous ou Inscrivez-vous pour répondre.