exécuter du code à  la prise de focus d'un TextField

RocouRocou Membre
février 2009 modifié dans API AppKit #1
Bonjour,

Soit un bouton qui ouvre une fenêtre (Panel) dans laquelle se trouve un objet DatePicker.
Quand l'utilisateur clique sur une date, celle-ci est affichée dans un TextField.

Tout ceci fonctionne très bien.

Je voudrais qu'une fois la date choisie par un clic de l'utilisateur, la fenêtre contenant le DatePicker, devenue inutile, se ferme.
J'ai bien réussi à  la fermer au clic mais alors la date n'est pas transmise au TextField (j'imagine que la fenêtre se ferme avant).
Aussi, j'ai pensé envoyer l'ordre de fermeture de ma fenêtre à  la prise de focus du TextField. Est-ce une bonne idée? Si oui (ou non), comment faire cela?

Réponses

  • schlumschlum Membre
    06:49 modifié #2
    C'est une fenêtre de type " Release on close " ?
    Y a pas de raison que la fermeture de la fenêtre empêche de récupérer la valeur.
  • NoNo Membre
    06:49 modifié #3
    dans 1234530978:

    Bonjour,
    Soit un bouton qui ouvre une fenêtre (Panel) dans laquelle se trouve un objet DatePicker.
    Quand l'utilisateur clique sur une date, celle-ci est affichée dans un TextField.
    Tout ceci fonctionne très bien.
    Je voudrais qu'une fois la date choisie par un clic de l'utilisateur, la fenêtre contenant le DatePicker, devenue inutile, se ferme.
    J'ai bien réussi à  la fermer au clic mais alors la date n'est pas transmise au TextField (j'imagine que la fenêtre se ferme avant).
    Aussi, j'ai pensé envoyer l'ordre de fermeture de ma fenêtre à  la prise de focus du TextField. Est-ce une bonne idée? Si oui (ou non), comment faire cela?


    Je n'ai pas tout saisi.
    Apparemment, tu as un textField et un bouton dans une fenêtre.
    Quand tu cliques sur le bouton, tu affiches une autre fenêtre (panel) qui montre un datePicker.
    Quand tu choisis une date (a priori tu utilises le datePicker graphique), le textField dans la première fenêtre doit être alimenté avec la date choisie dans le datePicker du panel, puis ce panel doit se fermer.

    Chez moi, un tel scénario fonctionne correctement.

    Voici le code de l'objet contrôleur :
    <br />@implementation unObjetControleurQuelconque<br /><br />- (IBAction)AfficheFenetreDatePicker:(id)sender<br />{<br /> &nbsp; [fenetreDatePicker makeKeyAndOrderFront:self];<br />}<br /><br />- (IBAction)actionDatePicker:(id)sender<br />{<br /> &nbsp; [textField setStringValue:[sender stringValue]];<br /> &nbsp; [fenetreDatePicker orderOut:self];<br />}<br /><br />@end<br />
    


    La méthode AfficheFenetreDatePicker: est attaché au bouton qui affiche le panel du datePicker. fenetreDatePicker est l'outlet qui pointe sur le panel du datePicker.
    La méthode actionDatePicker: est la méthode action du datePicker qui est appelée quand on choisit un date. textField est l'outlet du textField de la première fenêtre.

    La propriété release when closed n'est pas vraiment impactée, puisque normalement c'est la méthode action qui est utilsée, et c'est dans cette dernière que le panel est effacé (normalement par un orderOut:, à  moins que ce soit un close, et dans ce cas, plantage au deuxième clic sur le bouton si release when closed est coché).


  • RocouRocou Membre
    06:49 modifié #4
    dans 1234549845:

    Je n'ai pas tout saisi.
    Apparemment, tu as un textField et un bouton dans une fenêtre.
    Quand tu cliques sur le bouton, tu affiches une autre fenêtre (panel) qui montre un datePicker.
    Quand tu choisis une date (a priori tu utilises le datePicker graphique), le textField dans la première fenêtre doit être alimenté avec la date choisie dans le datePicker du panel, puis ce panel doit se fermer.

    Oui, c'est exactement cela.
    Merci pour le code mais y-a-t-il moyen de réaliser la même chose en utilisant uniquement Interface Builder?
  • RocouRocou Membre
    06:49 modifié #5
    dans 1234542195:

    C'est une fenêtre de type " Release on close " ?
    Y a pas de raison que la fermeture de la fenêtre empêche de récupérer la valeur.

    Non, pas de type "release on close".
    La "fermeture de la fenêtre qui empêche la récupération de la valeur", c'est juste mon hypothèse  ;)

    Comme je le signalais à  NO, j'essaie de faire tout cela sans rien coder, juste en utilisant IB.
    J'ai idiotement oublié de le préciser dans mon premier message.
  • NoNo Membre
    06:49 modifié #6
    Dès qu'on sort des sentiers battus (donc des règles et canons dictés par Apple), il va mettre mettre un peu les mains dans le cambouis...

    Quand tu dis que tu veux tout faire par IB, je pense que tu parles des bindings. Or, ma religion m'interdit d'utiliser les bindings.
    Les bindings, c'est mal !
    Les bindings, c'est crade !

    Et tu peux bien le voir : tu veux faire quelque chose d'un peu spécial, et hop, ça marche plus !
    Et comprendre pourquoi cela ne marche pas (le retour de valeur entre les 2 fenêtres), cela va être hard...
  • schlumschlum Membre
    février 2009 modifié #7
    Je supputais bien qu'il y avait du bindings là -dessous...

    Pareil que No, les bindings c'est LE mal. Ce n'est qu'une preuve de plus.  :o

    [Edit] Effectivement, avec un "release on close", plantage à  la seconde ouverture... mais il n'avait peut-être pas essayé de deuxième ouverture  :)
    Et ça aurait pu expliquer ce comportement aussi (mais ça aurait plus volontiers abouti à  un crash, c'est sûr...).
  • RocouRocou Membre
    06:49 modifié #8
    dans 1234873132:

    Je supputais bien qu'il y avait du bindings là -dessous...

    Pareil que No, les bindings c'est LE mal. Ce n'est qu'une preuve de plus.  :o

    [Edit] Effectivement, avec un "release on close", plantage à  la seconde ouverture... mais il n'avait peut-être pas essayé de deuxième ouverture  :)
    Et ça aurait pu expliquer ce comportement aussi (mais ça aurait plus volontiers abouti à  un crash, c'est sûr...).

    Rassure toi, ça m'est arrivé  :)
    C'est No qui m'a dépanné (http://www.objective-cocoa.org/forum/index.php?topic=2615.0)

    Merci à  tous les deux. Je ne sais pas encore ce que sont les bindings mais je trouvais bien pratique les raccourcis IB. Je vais devoir supprimer le "Date formatter" que j'avais glissé dans mon TextField et utiliser la classe dans mon code: du boulot en plus.

  • schlumschlum Membre
    06:49 modifié #9
    Appliquer un date formatter dans IB c'est pas du binding...
  • Philippe49Philippe49 Membre
    06:49 modifié #10
    dans 1234874461:

    Je vais devoir supprimer le "Date formatter" que j'avais glissé dans mon TextField et utiliser la classe dans mon code: du boulot en plus.

    çà , cela s'appelle faire compliqué quand on peut faire simple ...

    Quand aux bindings, je trouve les propos exagérés dans ce post.

  • RocouRocou Membre
    06:49 modifié #11
    dans 1234875668:

    dans 1234874461:

    Je vais devoir supprimer le "Date formatter" que j'avais glissé dans mon TextField et utiliser la classe dans mon code: du boulot en plus.

    çà , cela s'appelle faire compliqué quand on peut faire simple ...

    Je n'ai pas réussi à  faire simple  :P
    Dès que j'ai commencé à  utilisé du code, pfuiit, le Date formatter est devenu inopérant.
  • Nebuchad34Nebuchad34 Membre
    06:49 modifié #12
    Euh... Pourquoi tant de haine vis à  vis des Bindings ?  ???

    Je trouve ça plutôt génial au contraire et je dois dire que je ne me prive pas de les utiliser... assez souvent.  :o

    Je n'ai pas souvenir, d'ailleurs, d'une quelconque mise en garde dans le bouquin de Hillegass lorsqu'il nous fait découvrir ces outils "magiques" tant ils peuvent simplifier beaucoup de choses.
Connectez-vous ou Inscrivez-vous pour répondre.