[Résolu] Valeur par défaut et sauvegarde

respawnrespawn Membre
août 2008 modifié dans API AppKit #1
Bonjour à  tous,

je continue dans mon apprentissage de Cocoa/Obj-C

Aujourd'hui, je souhaite avoir des valeurs par défaut pour plusieurs variables et pouvoir changer cette valeur grâce à  une fenêtre "Settings" contenant plusieurs autres NSTextField ...

En gros, je lance mon programme, il sait que la valeur par defaut pour "server" est "localhost", si j'ouvre ma fenêtre "Settings", il est écrit dans mon champs NSTextField server "localhost", mais je peux le changer et mettre 127.0.0.1 et valider, ce qui change la valeur de la variable server et aussi, enregistre cette variable en tant que défaut.

si possible aussi, mettre un bouton "Restore" pour restaurer les valeurs "usines"

Merci beaucoup

Réponses

  • NoNo Membre
    11:18 modifié #2
    La classe NSUserDefaults est faite pour toi.
    Elle permet de gérer un fichier de préférence pour ton appli, où tu pourras y enregistrer des valeurs, pour les lire ensuite.
  • schlumschlum Membre
    11:18 modifié #3
    Ou CFPreferences si t'es plus à  l'aise avec le C  :P
  • respawnrespawn Membre
    11:18 modifié #4
    Oui, tout à  fait pour NSUserDefault ... j'ai commencé sur cette voie en fait ...

    J'ai lié mon bouton "Valider" de ma fenêtre de Settings à  la méthode settings dans mon fichier.m

    Ensuite, j'ai vu qu'il fallait déclarer un objet de type NSUserDefalt,j'ai donc cette ligne
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    


    Mais ensuite ...
    Comment enregistrer les valeurs de mes NSTextField dedans ?
    Comment associer mes variables utilisées plus tard à  ces valeurs ?
    Comment initialiser ces valeurs au premier lancement de l'appli (pas besoin de valider obligatoirement avant de lancer le programme) ?
  • NoNo Membre
    11:18 modifié #5
    dans 1218706114:

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    

    Mais ensuite ...
    Comment enregistrer les valeurs de mes NSTextField dedans ?
    Comment associer mes variables utilisées plus tard à  ces valeurs ?
    Comment initialiser ces valeurs au premier lancement de l'appli (pas besoin de valider obligatoirement avant de lancer le programme) ?


    NSUserDefaults agit un peu comme NSDictionary.

    Pour enregistrer une valeur :
    [tt][prefs setObject:uneChaineContenantLeServeur forKey:@server][/tt]

    et pour la lire :
    [tt]NSString *laChaineContenantLeServeur=[prefs stringForKey:@server][/tt]

    Et bien sûr, les valeurs à  lire ou à  enregistrer proviennents de tes textfields.

    Tu peux aussi utiliser les bindings, ce qui a l'avantage de mettre à  jours les usersDefaults de manière automatique (c'est le système via les bindings qui va faire le lien entre textField et userDefaults).
  • Philippe49Philippe49 Membre
    11:18 modifié #6
    Deux méthodes pour mettre au point des préférences :

    • Le chapitre 12 de Hillegass : avec les liaisons et synchronisations à  la main
    • Les bindings : tutoriel]
  • respawnrespawn Membre
    août 2008 modifié #7
    J'ai décidé d'utiliser NSUserDefault car le tuto des bindings n'est (contrairement à  la mise en page) absolument pas bien fait.

    J'ai donc mis dans une fonction
    <br />[prefs setObject:@&quot;toto&quot; forKey:@&quot;server&quot;];<br />	NSString *keskidi=[prefs stringForKey:@&quot;server&quot;];<br />	<br />	display = [[NSString alloc] initWithFormat:@&quot;Pref sauve %@ !&#092;n&quot;,keskidi];
    


    J'ai
    NSUserDefaults *prefs;
    
    juste après le @implementation. Si je le met dans la mêe fonction que les lignes précédentes, ca beug !

    Résultat ? "keskidi" vaut NULL ... Pourquoi ?
  • schlumschlum Membre
    11:18 modifié #8
    Il faut récupérer le sharedUserDefaults :

    NSUserDefaults *prefs = [NSUserDefaults sharedUserDefaults];
  • Philippe49Philippe49 Membre
    11:18 modifié #9
    dans 1218719230:

    J'ai décidé d'utiliser NSUserDefault

    Tu as raison de commencer par la méthode directe, tu en apprendras beaucoup plus.

    dans 1218719230:

    car le tuto des bindings n'est (contrairement à  la mise en page) absolument pas bien fait.

    Si tu veux qu'on l'améliore, je te propose, plus tard quand tu auras le temps, d'apporter les éléments complémentaires selon la manière dont tu le perçois (sans doute du texte présentant le principe de NSUserDefaults justement). Cela ne peux que profiter à  la communauté.    ;)
  • respawnrespawn Membre
    11:18 modifié #10
    Je viens d'essayer avec
    NSUserDefaults *prefs = [NSUserDefaults sharedUserDefaults];
    
    mais j'ai un warning et une erreur à  la compilation
    warning: &#39;NSUserDefaults&#39; may not respond to &#39;+sharedUserDefaults&#39;<br />error: initializer element is not constant<br />
    


    Si je sépare en deux, avec
    NSUserDefaults *prefs;
    
    après @implementation et
    prefs = [NSUserDefaults sharedUserDefaults];
    
    dans la fonction juste avant les autres lignes, warning et rien d'affiché ...

    Pour le tuto, ca serait avec plaisir, mais je pense qu'il va falloir un bon paquet de temps avant que je sois capable d'en faire autant ;-)
  • respawnrespawn Membre
    11:18 modifié #11
    OK, c'est parce que c'est standardUserDefaut et pas sharedUserDefaut :-)

    je continue ...
  • schlumschlum Membre
    11:18 modifié #12
    Ah oui, désolé, "standard", pas "shared"...
    Sont casse-pieds à  pas avoir de norme sur les noms des singletons  :(
    Des fois "default", des fois "standard", des fois "shared"...  :o
  • respawnrespawn Membre
    11:18 modifié #13
    Ok ben ca à  l'air de marcher :-) Merci encore

    Dernière question subsidiaire ;-) Comment faire pour transformer un string NSString en char * (je sais c'est pas bien mais je suis obligé de le faire :( ) ? Au passage où trouver une liste de toutes ces petites fonctions bien pratique (intValue etc etc) ?

    Merki
  • schlumschlum Membre
    11:18 modifié #14
    Les méthodes non deprecated demandent un encodage...
    Le plus simple c'est "UTF8String"
  • AliGatorAliGator Membre, Modérateur
    11:18 modifié #15
    dans 1218724425:

    Ok ben ca à  l'air de marcher :-) Merci encore

    Dernière question subsidiaire ;-) Comment faire pour transformer un string NSString en char * (je sais c'est pas bien mais je suis obligé de le faire :( ) ? Au passage où trouver une liste de toutes ces petites fonctions bien pratique (intValue etc etc) ?

    Merki
    Oui comme dit schlum le problème de transformer une NSString en char* n'est pas si simple car il faut savoir avec quel encodage tu travailles : US-ASCII, UTF8, ISO-Latin-1, ... pour tout ce qui est caractères spéciaux ou accentués, ça n'est pas représenté pareil...

    Sinon pour "trouver une liste de toutes ces petites fonctions bien pratiques" : ben c'est simple : la documentation, voyons !
    Accessible directement depuis Xcode, ou en utilisant une application comme AppKiDo (qui a l'avantage de lister directement aussi les méthodes des classes parent d'une classe donnée), ou encore la documentation en ligne (ici de NSString) !!
Connectez-vous ou Inscrivez-vous pour répondre.