Récupérer les valeurs de prefs

muqaddarmuqaddar Administrateur
07:35 modifié dans API AppKit #1
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 ?  :o
«1

Réponses

  • cbrandtcbrandt Membre
    07:35 modifié #2
    comment est instancé le contrôleur des préférences ? si c'est par le contrôleur de l'application, je suppose que celui-ci à  un pointeur vers le contrôleur des préférences... dans ce cas un setter/getter normal pour chaque variables dont tu as besoin dans contrôleur de l'application ?
  • muqaddarmuqaddar Administrateur
    07:35 modifié #3
    Dans le controlleurs des prefs :

    //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 ?
  • cbrandtcbrandt Membre
    07:35 modifié #4
    dans 1110287440:

    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...
  • muqaddarmuqaddar Administrateur
    07:35 modifié #5
    dans 1110289652:

    dans 1110287440:

    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 ?
  • cbrandtcbrandt Membre
    07:35 modifié #6
    le plus simple est effectivement mettre ton prefscontroller dans IB.
    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
    <br />{<br />    int toto;<br />}<br />- (int) toto;<br />- (void) setToto: (int) nouvtoto;<br />
    


    monprefscontroller.m
    <br />- (int) toto<br />{<br />    return toto;<br />}<br />- (void) setToto: (int) nouvtoto<br />{<br />    toto = nouvtoto;<br />}<br />
    


    et dans monapplicontroller.h
    <br />{<br />   monprefscontroller  *prefsctrl;<br />}<br />
    


    monapplicontroller.m
    <br />int bidule;<br />bidule = [prefsctrl toto];<br />
    


    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.
  • muqaddarmuqaddar Administrateur
    07:35 modifié #7
    Merci !!!
    C'ets beaucoup plus clair maintenant. ;)
  • mpergandmpergand Membre
    07:35 modifié #8
    Les singletons c'est bien jolis, mais ça me barbe un peu  :)
    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
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />typedef struct<br />	{<br />	int		val1;<br />	float	val2;<br />	bool	val3;<br />	}APP_PREFS;<br /><br /><br />@interface AppPrefs : NSObject {<br /><br />}<br /><br />+(APP_PREFS*) getPrefs;<br /><br />@end<br /><br />
    


    AppPrefs.m
    <br />#import &quot;AppPrefs.h&quot;<br /><br />static APP_PREFS appPrefs={10,10.25,TRUE};<br /><br /><br />@implementation AppPrefs<br /><br />+(APP_PREFS*) getPrefs<br />{<br />return &amp;appPrefs;<br />}<br /><br />@end<br />
    


    et un ex d'utilisation n'importe où dans l'appli:
    <br />APP_PREFS* appPrefs=[AppPrefs getPrefs];<br />printf(&quot; %d %f %d &#092;n&quot;,appPrefs-&gt;val1,appPrefs-&gt;val2,appPrefs-&gt;val3);<br /><br />appPrefs-&gt;val1=255;<br />appPrefs-&gt;val2=255.66;<br />appPrefs-&gt;val3=FALSE;<br />printf(&quot; %d %f %d &#092;n&quot;,appPrefs-&gt;val1,appPrefs-&gt;val2,appPrefs-&gt;val3);<br />
    


    Attention aux retain truc bidule dans le cas d'un objet ...
  • muqaddarmuqaddar Administrateur
    07:35 modifié #9
    Ah ouais, ça a l'air sympa de passer par une structure aussi.
    merci mpergand pour l'info.
  • amnesicamnesic Membre
    07:35 modifié #10
    Je te conseille aussi d'aller voir du coté du "binding" .. NSUserDefaultsController est bien pratique je trouve pour faire la "glue" entre ton model (NSUserDefaults) et ton interface avec un minimum de code :
    file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/NSUserDefaultsController.html
  • ClicCoolClicCool Membre
    07:35 modifié #11
    dans 1110332252:

    Je te conseille aussi d'aller voir du coté du "binding" ..


    Absolument :)

    Mais oxitan n'a pas fini de manger ton son code  >:)
    alors on l'a privé de binding!  ;D
  • muqaddarmuqaddar Administrateur
    07:35 modifié #12
    Oui, oui, je m'interdis les bindings pour l'instant pour mieux comprendre le code.

  • muqaddarmuqaddar Administrateur
    07:35 modifié #13
    Salut,

    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. :)
  • cbrandtcbrandt Membre
    07:35 modifié #14
    dans ce cas point de salut avec IB: on ne maà®trise pas l'ordre des instanciations. crée ton prefscontroller en singleton (et pas dans IB), et au 1er appel à  [Mon PrefsTruc sharedInstance], hop il sera créé...
  • muqaddarmuqaddar Administrateur
    07:35 modifié #15
    Mais je perds pas mes connections aux outlets des prefs si je vire l'instance de IB ?
  • fouffouf Membre
    07:35 modifié #16
    dans 1111759798:

    Mais je perds pas mes connections aux outlets des prefs si je vire l'instance de IB ?

    Si.

    Ce que tu peux faire c'est créer des outlets dans ton controleur principal  puis les récupérer avec des getters.
  • ClicCoolClicCool Membre
    07:35 modifié #17
    Ou alors peut-être faire comme l'a suggéré cBrandt
    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 ???
  • muqaddarmuqaddar Administrateur
    07:35 modifié #18
    Je me permets de vous demander de me m'aiguiller un peu plus. ;)

    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...
  • mpergandmpergand Membre
    07:35 modifié #19
    la solution c'est de séparer les données de prefs du controller !
  • BruBru Membre
    07:35 modifié #20
    dans 1111757831:

    Salut,

    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. :)


    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 !

    .
  • muqaddarmuqaddar Administrateur
    07:35 modifié #21
    Réponse à  mpergand :

    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.
  • muqaddarmuqaddar Administrateur
    mars 2005 modifié #22
    dans 1111762278:

    dans 1111757831:

    Salut,

    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. :)


    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) !


    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 :
    if ([prefs valueForKey:@&quot;checkingMailsPopup&quot;] != nil) { <br />		[checkingMailsPopup selectItemAtIndex: [checkingMailsPopup indexOfItemWithTag: [[prefs valueForKey:@&quot;checkingMailsPopup&quot;] intValue]]];<br />		valueForCheckingMails = [[prefs valueForKey:@&quot;checkingMailsPopup&quot;] intValue];<br />	}<br />	else { <br />		[checkingMailsPopup selectItemAtIndex: [checkingMailsPopup indexOfItemWithTag: 5]];<br />		valueForCheckingMails = 5;<br />	}
    


    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.
  • BruBru Membre
    07:35 modifié #23
    Pour ce genre de simplification de programmation, tu peux écrire une bonne vieille fonction C, ou (je vais faire plaisir à  mpergand) utiliser une méthode de classe (par exemple, celle de ton controleur de prefs).

    Dans un cas comme dans l'autre, point besoin d'avoir une instance d'objet...

    .
  • ClicCoolClicCool Membre
    07:35 modifié #24
    dans 1111762278:

    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 !


    + 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
  • mpergandmpergand Membre
    07:35 modifié #25

    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.


    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)
  • mpergandmpergand Membre
    07:35 modifié #26

    Pour ce genre de simplification de programmation, tu peux écrire une bonne vieille fonction C, ou (je vais faire plaisir à  mpergand) utiliser une méthode de classe (par exemple, celle de ton controleur de prefs).


    Le pire c'est j'ai donné la soluce avec une structure dans ce même post  :)
  • mpergandmpergand Membre
    07:35 modifié #27
    Dis-moi ClicCool, dans le cas d'un panneau de prefs avec un bouton Annuler, on fait comment avec les bindings ?
  • ClicCoolClicCool Membre
    07:35 modifié #28
    dans 1111765607:

    Dis-moi ClicCool, dans le cas d'un panneau de prefs avec un bouton Annuler, on fait comment avec les bindings ?


    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 ;)
  • muqaddarmuqaddar Administrateur
    07:35 modifié #29
    OK, merci de vos réponses.
    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 !
  • mpergandmpergand Membre
    07:35 modifié #30
    Bon allez, je te dis tout:
    Tu initialises les variables dans l'init du controller de prefs et ça marche...

    Mais j'aime pas  :(
  • muqaddarmuqaddar Administrateur
    07:35 modifié #31
    Héhé, oui j'avais déjà  remarqué ça, mais comme en même temps je fais mes réglages sur le nib en fonction des valeurs des prefs (voir mon code plus haut), je suis obligé de laisser le code ds le awakeFromNib pour que mes éléments graphiques soient bien réglés.

    Mais je vais faire comme j'ai dit plus haut.;)
Connectez-vous ou Inscrivez-vous pour répondre.