[Résolu] Créer, modifier, stocker une NSArray de NSString dans les préférences

berfisberfis Membre
décembre 2013 modifié dans API AppKit #1

Bonjour,


 


Je tâtonne depuis des heures et vais d'erreurs et erreurs en essayant de réaliser la chose suivante:


 


Dans les préférences de l'application, j'aimerais stocker une série de chaà®nes, en laissant à  l'utilisateur la possibilité d'en créer, d'en supprimer et de changer leur contenu. Bref, me retrouver au final avec un contenu de plist du genre:


...


NSArray


       NSString


       NSString



       NSString


       ...

...

 

La création, la modification et la suppression se feraient dans une NSTableView.

 


Comment faire pour gérer cette table via un contrôleur?


 


1. Dériver le SharedUserDefaultsController... pas envie de fricoter avec ça


2. Créer un NSArrayController, quitte à  le dériver, pour gérer le userDefaults.values.theArray


3. Passer par tout autre chose et stocker l'array dans les userDefaults à  la fin de l'application


 


Ou autre chose? D'avance merci si vous avez des idées à  suggérer.


Réponses

  • AliGatorAliGator Membre, Modérateur
    2
  • Bon, je crée et détruis des NSDictionaries à  volonté dans mon fichier de préférence, mais pas moyen de modifier le titre. Je n'ai aucune erreur à  l'exécution, mais aucun résultat non plus. J'ai fait comme indiqué ci-dessous, mais j'ai manqué une marche, visiblement. Laquelle?


  • berfisberfis Membre
    décembre 2013 modifié #4

    Bon... Le KVO ne fonctionne pas entre les clés/valeurs des NSDictionaries gérés par le "ColumnController" et le NSArray des UserDefaults. Il me faut donc faire, dans la méthode add: de ce contrôleur:


     


        [[NSUserDefaults standardUserDefaults]setValue:self.arrangedObjects forKey:@columns];


     

    pour palier cette insuffisance.

     

    Le NSArray est informé des ajouts et des suppressions, mais pas du comportement de chacun des objets compris dans ce NSArray. La réponse était tellement triviale que je comprends que personne ne me l'ait soufflée... <_<

  • Tu peux le faire simplement en plusieurs étapes : 


     


    Récupération du tableau :


    self.tableau = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@monTableau]];


     

    Tu fais tes modifications :

    addObject ... 

     

    Une fois fini tu le renvoi :


    [[NSUserDefaults standardUserDefaults] setObject:self.tableau forKey:@"monTableau"];



     


    Voila :)


  • Hello horus59153,


     


    C'est ce que j'ai fini par faire, sauf que c'est un peu plus complexe, il s'agit d'une NSArray de NSDictionaries, je suis donc obligé de rendre tout ça mutable pour le modifier, mais à  la fin c'est tout bon.


     


    Comme j'ai besoin d'actualiser les préférences (communes) et pas les données de mon contrôleur (appelons-les privées) j'ai rendu ce dernier hypersensible aux changements (des Validate Immediately dans chaque champ, des addObserver tout azimut) et je réécris les préférences à  chaque fois que quelque chose bouge. Comme une telle opération est quasi instantanée, le reste de l'application reste très réactive. Et si l'utilisateur décide de forcer à  quitter ou arrache le prise (on ne sait jamais) il ne perd pas grand-chose...


     


    C'est marrant d'ailleurs, j'ai remarqué un truc sur les keypaths des UserDefaiults, des fois il faut préfixer "values." et des fois non. J'ai donc dû recourir à  des NSLog pour voir ce que le centre de notifications m'envoyait.


     


    Personne n'a dit que la vie était un jardin de roses.


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