Récupérer les valeurs de prefs
muqaddar
Administrateur
Salut,
J'ai 2 controlleurs. Un général pour mon appli et un pour mes prefs.
Dans celui de mes prefs, je récupère donc toutes les clés et j'ai donc toutes mes vars d'instances.
J'ai besoin de récupérer ces variables ds mon controlleur général. Quelle est la méthode la plus simple ?
J'ai 2 controlleurs. Un général pour mon appli et un pour mes prefs.
Dans celui de mes prefs, je récupère donc toutes les clés et j'ai donc toutes mes vars d'instances.
J'ai besoin de récupérer ces variables ds mon controlleur général. Quelle est la méthode la plus simple ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
//PREFERENCES
prefs = [[NSUserDefaults standardUserDefaults] retain];
Ensuite , j'ai toutes mes vars, sans accesseur pour l'instant... y'en aura une 30aine... de ce type là ds PrefsController :
valueForChecking = [[prefs valueForKey:@EnableChecking] intValue]
que je dois donc récupérer dans le controlleur principal.
Je n'instancie pas le controlleur des prefs ds le controlleur de l'appli... est-ce à faire ?
il faut bien l'instancier quelque part... ou bien tu l'as mis dans le nib de l'appli (et dans ce cas il suffit de mettre un outlet du controleur de l'appli vers celui des prefs) ou alors tu fais un alloc/init dans le controleur de l'appli...
Je nage. Toujours autant de mal à faire communiquer mes différentes classes entre elles.
J'ai effectivement une instance de mon controlleur dans IB. Si je mets un outlet vers le controlleur des prefs depuis celui de l'appli, que faudra t-il faire ensuite pour récupérer mes variables ?
Si je fais un alloc, init ds mon controlleur principal, je trouve ça bizarre pour un singleton non ?
pour récupérer dans le applicontroller par l'exemple l'instance de la variable toto du controleur de prefs, ajoutes dans IB un outlet du applicontroller vers le prefscontroller puis ajoutes un getter (et peut-être un setter) dans ton prefscontroller:
monprefscontroller.h
monprefscontroller.m
et dans monapplicontroller.h
monapplicontroller.m
l'inconvénient de mettre beaucoup de singleton dans IB, est qu'ils vont tous être instanciés au démarrage de l'appli.
si tu fais des singleton instanciés dans l'appli, au moment du premier appel à ce singleton, alors l'appli se charge un peu plus vite.
C'ets beaucoup plus clair maintenant.
En Java j'utilise une classe avec uniquement des variables static et zou (je suis grand je fait ce que je veux )
Donc, une structure en fait.
En ObjC ça pourrait donner, pour une classe AppPrefs:
AppPrefs.h
AppPrefs.m
et un ex d'utilisation n'importe où dans l'appli:
Attention aux retain truc bidule dans le cas d'un objet ...
merci mpergand pour l'info.
file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/NSUserDefaultsController.html
Absolument
Mais oxitan n'a pas fini de manger ton son code
alors on l'a privé de binding! ;D
J'ai le problème suivant.
Mon controleur des prefs est instancié après celui qui lui réclame les valeurs des prefs. Il faudrait que le controleur des prefs soit instancié en premier, or il est instancié par IB en instance unique au démarrage.
Quelle solution s'offre à moi ? Merci.
Si.
Ce que tu peux faire c'est créer des outlets dans ton controleur principal puis les récupérer avec des getters.
Tu crée une classe singleton dans les règles de l'art.
C'est à dire que le +init de la classe doit:
- Soit initialiser le singleton
- Soit renvoyé le singleton que t'as déjà intitialisé avant.
Il me semble que dans ce cas I.B. devrait lancer l'initialisation d'une nouvelle instance mais ... se retrouver avec ta seule et unique instance.
Reste que je sais pas trop comment il va alors gérer les liens vers les outlets ???
Mais essaies, après tout, quand t'as une "instance" du FontManager dans ton nib c'est la même chose non ?
Sauf que le FontManager a des actions mais pas d'outlets en effet, J'ai pas en tête de singleton dans IB qui ait des outlets.
Mais ça doit bien être possible quand même ???
Donc je la supprime ou pas l'instance dans IB ?
De même, c'est la première fois que je me sers de sharedInstance.
Donc je veux l'utiliser dans le init de mon controller principal.
Celui-ci a un outlet qui pointe vers le controller des prefs. Sauf que si je vire l'instance dans IB, ça ne sera plus efficace...
Comment font les développeurs en général pour récupérer leurs prefs ? Ils sont bien obligés d'avoir une classe à part pour les gérer...
Normalement, on n'a pas à créer ou utiliser de "contrôleur de prefs" (hormis celui qui va servir à modifier les prefs via une fenêtre ou un prefpane) !
Dans le reste du programme, pour lire une pref qui va être utilisée comme paramétrage, on se doit d'utiliser le [[NSUserDefaults standardUserDefaults] objectForKey:@blabla] qui va bien !
.
Bein elle sont séparées là , non ?
Une classe controller principale.
Une classe controller des prefs.
+ 3 autres controllers qui ont besoin des prefs
La classe controller des prefs instancie toutes les variables de prefs et s'occupe de leur mise à jour. J'ai créé des getters dans cette classe. Et avec un outlet je comptais les récupérer dans chacune de mes classes.
C'est celui-là dont il est question...
Donc dans chacune de mes autres classes, je dois refaire [[NSUserDefaults standardUserDefaults] objectForKey:@blabla] ? Que j'ai déjà fait dans le controller des prefs ?
Par exemple ds mon controller de prefs j'ai ça :
et je me retrouve avec ma valeur de valueForCheckingMails...
JE comptais pas refaire tout ce mic/mac à chaque fois que j'ai besoin de la valeur de valueForCheckingMails dans mes autres classes.
Dans un cas comme dans l'autre, point besoin d'avoir une instance d'objet...
.
+ 1
P.S.1.:
Ahaaa faudrait aussi inventer une sorte de contrôleur qui serait aussi capable de gérer les modifications via la fenêtre des prefs et celle enregistrées automatiquement (position et organisation des fenêtre ...).
Un contrôleur qui ferait le lien et assurerait les mises à jour synchro etc ...
Enfin, faut pas réver ::)
P.S.2.:
Comment on dit lier, dans le sens "pontage", en anglais déjà ?
P.S.3.:
ah oui: to Bind ! ;D :P
le controller de prefs est un utilisateur des prefs comme les autres classes de ton appli. Ton problème c'est que tu as lié ces variables de prefs au controller de prefs. Il faut rendre ces variables de prefs indépendantes de tout controller. ( remember Mvc )
Sinon t'es coincé...
Soit tu fais comme bru (le plus simple)
Le pire c'est j'ai donné la soluce avec une structure dans ce même post
ah!
Tu peux inclure un bouton "revert to initial Value" que le controlleur de prfs gère sans pb. Mais celà concerne l'ensemble des prefs qui son alors "réinitialisées"
Si tu parles d'annuler la (les) dernières modifications précisemment, il te faut alors utiliser le KVO pour t'inscrire comme Observer des propriétés et enregistrer alors le undo-event qui va bien chaque fois que tu es notifié d'un changement
Je vais faire au plus simple.
Prendre les prefs quand j'en ai besoin dans mes classes avec [NSUserDefaults standardUserDefaults] et simplifier mon code dans le controller des prefs.
Bon week-end !
Tu initialises les variables dans l'init du controller de prefs et ça marche...
Mais j'aime pas
Mais je vais faire comme j'ai dit plus haut.;)