Utlisation des userDefaults

macvelottemacvelotte Membre
21:56 modifié dans API AppKit #1
Je mets en mémoire une chaine de caractères :
[[NSUserDefaults standardUserDefaults] setObject:villeMemo forKey:@"maVille"];

Dans "awakeFromNib", je rappelle cette châine :
maville=[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;maVille&quot;];<br />

Problème : si le fichier Préférences n'existe pas, il y a plantage au démarrage ...
Comment éviter le plantage ?

Réponses

  • aranaudaranaud Membre
    21:56 modifié #2
    Il faut en créer un par défaut si il n'exite pas.

    <br />+ (void)initialize      <br />//      init des préférences par défaut : avant le chargement de MainMenu.nib<br />{<br />    //  création des préférences par défaut<br />    NSMutableDictionary *prefDefaut = [NSMutableDictionary dictionary];<br />....<br />    [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:prefDefaut];      // référencer le dictionnaire des préférences par défaut<br />}<br />
    


    A mettre dans ta classe principale.
  • macvelottemacvelotte Membre
    21:56 modifié #3
    OK, mais où se place le chargement de MainMenuNib ? Dans main.m ?
  • aranaudaranaud Membre
    21:56 modifié #4
    Je ne comprend pas bien ta question mais pour information.

    + (void)initialize se lance au chargement de la classe.
    - (void)awakeFromNib se lance au chargement de MainMenuNib.
    Le MainMenuNib se charge tout seul au lancement de l'application et la classe principale se charge avant le MainMenuNib.
  • macvelottemacvelotte Membre
    21:56 modifié #5
    On ne se comprend pas ...

    Mon problème est que je vais chercher une chaà®ne e caractères dans un fichier qui n'existe pas encore (ce qui va se passer au premier lancement de mon app.: le fichier est créé par l'application !)



  • aranaudaranaud Membre
    21:56 modifié #6
    Avec NSUserDefaultsController, il ne créait le fichier préférence que si une variable change par rapport au choix définie par défaut.

    1 - Si le fichier préférences n'existe pas, il choisit les valeurs par défauts.

    2 - Si une valeur change et que le fichier préférence n'existe pas, l'application le créait avec comme seule information, celle qui est différente de la valeur par défaut.

    3 - Quand tu quittes l'application le fichier préférences est écrit sur le disque durs.

    4 - Lors d'une utilisation ultérieur de l'application, le programme recherche déjà  dans le fichier préférence et s'il y ne la trouve pas prend celle par défaut.

    Résumé : seule les valeurs modifient par rapport aux valeurs par défaut sont écrites dans le fichier préférence. Tu n'as pas besoin de savoir si le fichier existe ou pas. C'est la classe NSUserDefaultsController qui fait le travaille.
  • fouffouf Membre
    21:56 modifié #7
    dans 1113052748:

    Je ne comprend pas bien ta question mais pour information.

    + (void)initialize se lance au chargement de la classe.
    - (void)awakeFromNib se lance au chargement de MainMenuNib.
    Le MainMenuNib se charge tout seul au lancement de l'application et la classe principale se charge avant le MainMenuNib.



    Oui et non.

    awakeFromNib est seulement appelé dans une classe qui est instanciée dans un fichier nib. awakeFromNib est appelé quand tous les outlets sont reliés, donc après init.
  • Eddy58Eddy58 Membre
    21:56 modifié #8
    Tu compares, et si tu obtiens nil tu mets la valeur par défaut que tu veux : :)
    [tt]
    if ([[NSUserDefaults standardUserDefaults] stringForKey:@maVille]==nil)
    {
        maVille=@Valeur par défaut;
    }
    [/tt]
  • aranaudaranaud Membre
    21:56 modifié #9
    Si tu as 50 valeurs, sa commence à  faire beaucoup de ligne ...  ::)

    Surtout, si tu utilises les variables dans plusieurs classes.
  • Eddy58Eddy58 Membre
    avril 2005 modifié #10
    C'est vrai Aranaud, mais un seul test suffit pour savoir si le fichier est créé ou pas, si ce test donne nil tu initialises toutes tes variables avec leur valeur par défaut. En ce qui concerne l'utilisation sur plusieurs classes, des getters sur la classe qui charge les prefs font bien l'affaire...:)
  • macvelottemacvelotte Membre
    21:56 modifié #11
    OK Eddy58, c'était tout bête : je gérais mal le "nil" !
Connectez-vous ou Inscrivez-vous pour répondre.