Sauvegarde des préférences

apocaalypsoapocaalypso Membre
21:27 modifié dans API UIKit #1
Bonjour,

Je souhaiterai sauvegarder la valeur d'un UISwitch pour la rétablir lors du prochain lancement de l'application. J'ai rechercher des topics similaires et à  l'aide de la doc j'ai pu faire ceci :
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];<br />	<br />	// Did the user choose the Extreme mode ?<br />	if(extreme.state)<br />	{<br />		[prefs setBool:YES forKey:@&quot;extreme&quot;];<br />	}<br />	<br />	else<br />	{<br />		[prefs setBool:NO forKey:@&quot;extreme&quot;];<br />	}<br />


Et voici mon code qui affiche les dernières préférences :
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];<br />	<br />	// The user want the Extreme mode<br />	if([prefs boolForKey:@&quot;extreme&quot;])<br />	{<br />		[extreme setOn:YES animated:YES];<br />	}<br />	// He does not want it<br />	else<br />	{<br />		[extreme setOn:NO animated:YES];<br />	}<br />


Je n'ai pas d'erreur mais mon code ne sauvegarde rien, lorsque je met le UISwitch à  ON, que je quitte l'application et que je la re-lance, le UISwitch et à  OFF.
J'ai vu qu'il y aurait peut-être une histoire de NSDictionnary.

Comment pourrais-je sauvegarder la valeur de mon UISwitch ?

Merci beaucoup !

Guillaume.

Réponses

  • Philippe49Philippe49 Membre
    21:27 modifié #2
    D'après la doc, il me semble que la property d'un UISwitch est
    @property(nonatomic, getter=isOn) BOOL on
    et non state

    Donc essaye extreme.on au lieu de extreme.state

  • apocaalypsoapocaalypso Membre
    21:27 modifié #3
    Ah... Effectivement ça marche, désolé de m'être fait avoir sur un coup aussi évident.

    Merci Philippe !
  • Philippe49Philippe49 Membre
    21:27 modifié #4
    C'est vrai qu'on se demande pourquoi ils n'ont pas pris la property state de UIControl ... sans doute une question de type du résultat.
  • CéroceCéroce Membre, Modérateur
    21:27 modifié #5
    Tu peux écrire plus simplement:

    <br />	NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];<br />	<br />	// Did the user choose the Extreme mode ?<br />	[prefs setBool:extreme.isOn forKey:@&quot;extreme&quot;];<br />
    


  • apocaalypsoapocaalypso Membre
    21:27 modifié #6
    Merci Céroce ! ;)
  • allianallian Membre
    21:27 modifié #7
    Dans la même lignée, que me conseillez vous afin de sauvegarder une liste de favoris ? Ce ne sont que des id à  sauvegarder.

    Est il plus facile avec une PList ou alors des entrees dans ma base ?
  • muqaddarmuqaddar Administrateur
    21:27 modifié #8
    dans 1241691841:

    Dans la même lignée, que me conseillez vous afin de sauvegarder une liste de favoris ? Ce ne sont que des id à  sauvegarder.

    Est il plus facile avec une PList ou alors des entrees dans ma base ?



    Le plus simple c'est un PLIST.
    Mais si t'as déjà  une base... ça vaut p-e le coup de s'en servir... une requête SQL et hop.
  • allianallian Membre
    21:27 modifié #9
    ok merci, je pense que je vais me pencher vers la base, vu que je sais déjà  l'utiliser alors que les Plist j'ai pas encore vu comment cela fonctionnait.

    :)
  • Philippe49Philippe49 Membre
    21:27 modifié #10
    C'est bien compliqué ... NSUserDefaults est là  pour cela.


    Dans l'app delegate (par exemple)
    +(void) initialize {<br />	NSUserDefaults * standardUserDefaults=[NSUserDefaults standardUserDefaults];<br />	NSString * prefsPath=[[NSBundle mainBundle] pathForResource:@&quot;PrefsDefaults&quot; ofType:@&quot;plist&quot;];<br />	NSDictionary * dico=[NSDictionary dictionaryWithContentsOfFile:prefsPath];<br />	[standardUserDefaults registerDefaults:dico];<br />}
    


    Dans les ressources un fichier PList (add > new file , naviguer et choisir plist.


    Puis ensuite, sauver ou lire les préférences quand il le faut
    <br />	NSUserDefaults * standardUserDefaults=[NSUserDefaults standardUserDefaults];<br />	[standardUserDefaults setInteger:wallPaper forKey:@&quot;WallPaper&quot;];
    


    et tout se fait là  où il faut ...
  • AliGatorAliGator Membre, Modérateur
    21:27 modifié #11
    Sachant que le plist dont parle Philippe, ainsi que les 3 lignes "prefsPath = ...", "dico = ..." et "registerDefaults:dico", ne sont là  que pour fournir une valeur par défaut des préférences, pour qu'au premier lancement tes préférences (ton tableau d'id dans ton cas) ne soit pas vide.

    Mais si ça te dérange pas qu'il soit vide, t'as mm pas besoin de rajouter ça. Un simple [tt][[NSUserDefaults standardDefaults] setObject:monArray forKey:@ids];[/tt] pour sauvegarder un NSArray* monArray dans les prefs, et un [tt]monArray = [[NSUserDefaults standardDefaults] arrayForKey:@ids][/tt] pour relire les prefs, et basta.
  • allianallian Membre
    21:27 modifié #12
    Effectivement pas très compliqué tout ça.  :adios!:

    Après niveau performance c'est pareil ou pas ? Sachant que j'ai déjà  une BD dans mon app.
  • AliGatorAliGator Membre, Modérateur
    21:27 modifié #13
    Bah à  mon avis c'est kif-kif dans ce cas, surtout niveau prefs que tu n'écris donc pas forcément toutes les 3 secondes non plus. Cependant, vu que c'est un tableau d'IDs que tu semble vouloir écrire, pour l'écrire dans ta base SQLite il te faudra certainement plusieurs requêtes UPDATE/INSERT pour rentrer tous tes IDs par exemple... donc bon là  du coup évidemment, les NSUserDefaults sont plus efficaces.
  • allianallian Membre
    21:27 modifié #14
    ok ok je vais faire comme ça, en plus ca me fera apprendre leur utilisation.
    merci 
  • allianallian Membre
    21:27 modifié #15
    je viens d'essayer mais je n'arrive pas à  ajouter d'éléments, je pense que les premières lignes exécutées dans l'appDelegate fonctionnent, mais ensuite si j'essaye de faire des ajouts cela ne fonctionne pas.

    L'ajout ne s'effectue pas dans l'appDelegate mais dans un de mes contrôleurs, cela vient il de la ?

    [appDelegate.favArray addObject:huh];<br />	[appDelegate.standardUserDefaults setObject:appDelegate.favArray forKey:@&quot;ids&quot;];
    


    voici la méthode qui devrait ajouter. Celle ci est bien appelé au travers d'un bouton et l'objet huh existe bien.
  • Philippe49Philippe49 Membre
    21:27 modifié #16
    dans 1241711801:

    je viens d'essayer mais je n'arrive pas à  ajouter d'éléments, je pense que les premières lignes exécutées dans l'appDelegate fonctionnent, mais ensuite si j'essaye de faire des ajouts cela ne fonctionne pas.

    Comment vois-tu que cela ne fonctionne pas ?

    dans 1241711801:

    L'ajout ne s'effectue pas dans l'appDelegate mais dans un de mes contrôleurs, cela vient il de la ?

    Non ce n'est pas un problème

    dans 1241711801:

    [appDelegate.favArray addObject:huh];<br />	[appDelegate.standardUserDefaults setObject:appDelegate.favArray forKey:@&quot;ids&quot;];
    


    En général, on ne crée de variable d'instance pour le standardUserDefaults, car n'importe où dans ton code tu peux atteindre ce singleton par
    NSUserDefaults * standardUserDefaults=[NSUserDefaults standardUserDefaults];
  • allianallian Membre
    21:27 modifié #17
    J'espère que tout le monde a passé un bon weekend.
    Merci de ta réponse, j'ai compris comment faire je pense mais si j'essaye ton exemple il est censé rajouté dans mon PList une entrée nommé Wallpaper avec un entier dedans, c'est ça ?

    Mais quand je regarde dans mon fichier il n'y a rien dedans.

  • Philippe49Philippe49 Membre
    21:27 modifié #18
    dans 1242028126:

    Mais quand je regarde dans mon fichier il n'y a rien dedans.

    A quel moment regardes-tu dans ton fichier ?
    Le standardUserDefaults est une image du plist dans ton code (une classe contenant un dictionnaire sans doute) , et le report ne se fait qu'à  la fin de ton programme. Sauf si explicitement tu fais exécuter la méthode synchronize de NSUserDefaults, mais en général, cela n'a pas d'intérêt.
    Donc pour voir les transformations, il faut quitter ton application.   
  • allianallian Membre
    21:27 modifié #19
    ok ok je crois que j'ai compris, en faite le fichier PList n'est pas obligatoire comme a dit AliGator, vu que moi je veut sauvegarder uniquement un tableau d'entiers j'ai juste besoin d'accéder à  mon NSUserDefault pour lui mettre mon tableau dedans et après de même pour récupérer les valeurs mais en faite ces valeurs ne sont pas écrites dans mon fichier mais dans un fichier que gère le téléphone lui même, c'est ça ?


    Du coup la j'ai testé d'ajouter un entier et si je le rappelle dans un autre endroits de mon appli cela fonctionne bien. Donc normalement si je relance l'appli il devrait me garder cette valeur ?
    Merci
  • Philippe49Philippe49 Membre
    21:27 modifié #20
    dans 1242029454:

    ok ok je crois que j'ai compris, en faite le fichier PList n'est pas obligatoire comme a dit AliGator, vu que moi je veut sauvegarder uniquement un tableau d'entiers j'ai juste besoin d'accéder à  mon NSUserDefault pour lui mettre mon tableau dedans et après de même pour récupérer les valeurs mais en faite ces valeurs ne sont pas écrites dans mon fichier mais dans un fichier que gère le téléphone lui même, c'est ça ?

    En cours d'exécution, ton programme n'écrit pas dans un fichier (sauf demande explicite de ta part) mais écrit dans la mémoire qu'il utilise. Un de tes objets est une instance de la classe NSUserDefaults qui sert à  mémoriser les changements des paramètres principaux de ton appli.


    dans 1242029454:

    Du coup la j'ai testé d'ajouter un entier et si je le rappelle dans un autre endroits de mon appli cela fonctionne bien. Donc normalement si je relance l'appli il devrait me garder cette valeur ?
    Merci

    Oui à  la fin de ton programme, les modifications seront reportées dans un plist se trouvant dans le répertoire "Library" du sand box de ton appli : tu peux le voir dans le répertoire du simulateur : ~/Library/Application Support/iPhone Simulator/User/Applications/ n° de ton application/Library/Preferences/
  • allianallian Membre
    21:27 modifié #21
    Cool merci pour ton aide ca marche nikel maintenant :D
    Reste à  ajouter un deuxieme bouton dans ma navigationBar.
    JE vais ouvrir un autre topic pour ça.

  • allianallian Membre
    21:27 modifié #22
    enfaite, je galère un peu..
    j'arrive pas à  récupérér le tableau précédemment sauvé et lui ajouter de nouvelles valeurs, je fais cela :

    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];<br />	NSArray *monArray =&nbsp; [standardUserDefaults arrayForKey:@&quot;ids&quot;];<br />	NSMutableArray *monMutableArray = [NSMutableArray arrayWithArray:monArray];<br />	<br />	<br />	[monMutableArray addObject:[NSNumber numberWithInt:spotID]];<br />int h = [monMutableArray objectAtIndex:0]; <br />NSLog(@&quot;%i&quot;, h);<br />	[standardUserDefaults setObject:monArray forKey:@&quot;ids&quot;];<br />	NSLog(@&quot;save to fav this spot %i&quot;, spotID);
    



    Le premier log me retourne 17133408 qui je pense doit etre l'id de l'objet retourné. Comment faire pour avoir sa valeur et non pas son emplacement ???

    Merci
  • Philippe49Philippe49 Membre
    21:27 modifié #23
    dans 1242046821:

    [monMutableArray addObject:[NSNumber numberWithInt:spotID]];
    int h = [monMutableArray objectAtIndex:0];
    NSLog(@%i, h);

    Le premier log me retourne 17133408 qui je pense doit etre l'id de l'objet retourné. Comment faire pour avoir sa valeur et non pas son emplacement ???

    Un NSArray ne peut stocker que des objets, pas des types C simples. On lit dans le tableau un NSNumber qui est justement une classe pour pouvoir faire des objets à  partir de types simples.
    [monMutableArray addObject:[NSNumber numberWithInt:spotID]];
    NSNumber * number=[monMutableArray objectAtIndex:0];
    int h=[number intValue];
    NSLog(@%d, h);
  • Philippe49Philippe49 Membre
    21:27 modifié #24
    Dans le setObject, remplacer par le nouvel array, pas par l'ancien

    <br />	NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];<br />	NSArray *monArray =&nbsp; [standardUserDefaults arrayForKey:@&quot;ids&quot;];<br />	NSMutableArray *monMutableArray = [NSMutableArray arrayWithArray:monArray];	<br />	[monMutableArray addObject:[NSNumber numberWithInt:spotID]];<br /><br />	// Remplacer par la nouvelle version <br />	[standardUserDefaults setObject:monMutableArray forKey:@&quot;ids&quot;];<br />
    

  • allianallian Membre
    21:27 modifié #25
    Merci grâce à  la doc, j'ai pu voir la méthode intValue que tu m'a ensuite conseillé, tout fonctionne maintenant très bien et c'est très efficace.
    Merci beaucoup pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.