Action lors d'un clic n'importe où dans la fenêtre

TournesolTournesol Membre
15:20 modifié dans API AppKit #1
Bonjour,

Je débute en programmation Cocoa et je suis bloqué par un problème sûrement très simple. J'espère que quelqu'un pourra m'aider.

J'ai une fenêtre dans laquelle j'ai un NSDatePicker (le petit calendrier). J'ai un bouton qui permet d'afficher/masquer ce calendrier, et il fonctionne bien. Mais ce que j'aimerais obtenir, c'est que le petit calendrier soit caché automatiquement lorsque je clique n'importe où dans la fenêtre, en dehors du calendrier. Euh, je sais pas si c'est très clair?!

Mon problème, c'est que je ne sais pas comment faire pour détecter un clic hors du NSDatePicker. Est-ce qu'il y a une méthode delegate pour ça? J'en ai pas trouvée...

C'est sûrement tout simple, j'ai rien trouvé sur le forum. Merci.

a+

Réponses

  • AliGatorAliGator Membre, Modérateur
    octobre 2005 modifié #2
    dans 1129217277:
    Mon problème, c'est que je ne sais pas comment faire pour détecter un clic hors du NSDatePicker. Est-ce qu'il y a une méthode delegate pour ça? J'en ai pas trouvée...

    C'est sûrement tout simple, j'ai rien trouvé sur le forum. Merci.

    a+
    Salut,

    Je n'ai pas la doc Cocoa sous les yeux, mais il me semble qui'l faut regarder du côté du Firstresponder.
    (info sur l'ADC)

    Quand un objet (plus exactement un objet qui dérive de la classe NSResponder, cette classe étant déjà  dérivée de NSObject) devient actif il devient le firstResponder et c'est lui qui réceptionne les clics souris et les events de clavier. Quand tu cliques sur un autre objet, l'ancien objet qui était firstResponder (l'ancien objet actif) perd le statut de firstResponder.

    Donc ton NSDatePicker va recevoir le message resignFirstResponder: quand il ne sera plus actif parce que tu auras cliqué sur autre chose (NSTextField, bouton, ...)

    [EDIT]Ayé j'ai retrouvé la doc sur le net (et corrigé le nom du message, je m'étais gourré) :

    c'est là 
  • fouffouf Membre
    octobre 2005 modifié #3
    Bienvenue sur Objective-Cocoa, Tournesol.

    Non, a ma connaissance, il n'y a pas de méthode de delegate pour détecter le clique, par contre, tu peux sous-classer NSWindow et implémenter mouseDown: qui est la méthode appelée pour le clique. Ensuite tu envoies le message au controlleur eventuel ou bien la sous-classe de la fenêtre fais elle-même le boulot et masque le calendrier.

    Voila, je ne sais pas si j'ai été clair ;)
    fouf

    [grilled but autre solution par Aligator]

    En effet, Aligator a raison, si le NSDatePicker était le firstResponder et qu'il abandonne cet état, on va lui envoyer -(BOOL)resignFirstResponder, méthode dans laquelle tu masqueras le datePicker et tu finiras pas retourner YES. Par contre, cela ne marche qu'avec un sous-classement de NSDatePicker. :fouf):
  • TournesolTournesol Membre
    15:20 modifié #4
    Déjà  merci beaucoup pour vos réponses!

    Il me semble avoir tout bien compris, mais ça ne marche toujours pas. Je résume ce que j'ai fait:
    - dans IB, j'ai créé une sous-classe de NSDatePicker, que j'ai appelée MyDatePicker, avec un outlet "myUIController" vers mon objet "UIController"
    - j'ai sélectionné l'ancien NSDatePicker, et depuis l'inspecteur: cusom class: j'ai choisi MyDatePicker
    - dans XCode, dans MyDatePicker.h, j'ai écrit:
    <br />- (BOOL)resignFirstResponder;<br />
    

    - dans MyDatePicker.m, j'ai écrit:
    <br />- (BOOL)resignFirstResponder {<br />	[myUIController hideGraphicalDatePicker];<br />	return YES;<br />}<br />
    


    Voilà . Le tout compile sans erreur ni warning, je peux toujours cacher/afficher mon calendrier avec le bouton, mais lorsque je clique à  côté du calendrier, rien ne se passe, il reste affiché.

    Je ne vois pas où est le problème.

    Juste au cas où, je mets encore le code de ma classe UIController:
    <br />@implementation UIController<br /><br />- (void)hideGraphicalDatePicker {<br />	[datePanel setHidden:YES];<br />}<br /><br />- (void)toggleGraphicalDateDisplay:(id)sender {<br />	[datePanel setHidden:!([datePanel isHidden])];<br />	}<br /><br />@end<br />
    


    En tout cas merci pour vos messages! ça m'a vraiment beaucoup aidé!
  • TournesolTournesol Membre
    15:20 modifié #5
    Ah, je crois que j'ai trouvé pourquoi ça marchait pas!! :p

    Dans ma classe MyDatePicker, il fallait réécrire la méthode
    - (BOOL)acceptsFirstResponder
    pour qu'elle renvoie YES
  • AliGatorAliGator Membre, Modérateur
    15:20 modifié #6
    YES !  <3 :adios!:<br />
    Ben ça c'est cool, parce que tu vois je suis pas un as des firstResponder et de la responderChain, je n'ai jamais eu l'occasion de me plonger dedans vraiment, j'avais juste vaguement compris le concept sans jamais trop tester.  :brule:
    Du coup quand je t'ai écrit le message, je doutais un peu, Surtout quand fouf t'a répondu et ne t'a pas touché un mot sur le firstResponder.  :o
    Donc du coup si tu me dis qu'avec le principe des firstResponder ça fonctionne, je suis  :p happy  :p parce que ça veut aussi dire que j'ai bien capté le concept  :) ;)
  • AntilogAntilog Membre
    15:20 modifié #7
    Je ne voudrais pas gâcher la joie du lézard  o:) , mais...

    Tout ça ne me semble pas forcément très "user-friendly" (faire disparaà®tre un controle qui n'a plus le focus).

    Est-ce que tu as réellement besoin de faire ça?
    Ne pourrais-ce pas être traité autrement?
  • TournesolTournesol Membre
    15:20 modifié #8
    dans 1129280576:

    Je ne voudrais pas gâcher la joie du lézard  o:) , mais...

    Tout ça ne me semble pas forcément très "user-friendly" (faire disparaà®tre un controle qui n'a plus le focus).

    Est-ce que tu as réellement besoin de faire ça?
    Ne pourrais-ce pas être traité autrement?


    Dans mon appli, j'ai un NSDatePicker au format texte, et à  côté un bouton qui permet d'afficher un NSDatePicker au format graphique. Mais comme ça prend de la place, j'aimerais qu'il disparaisse un fois que j'en ai plus besoin. Bon, je ne sais pas si c'est une solution très user friendly. Voici deux petites captures:
    image19ng.png image24ol.png

    En tout cas merci pour votre aide  :)
  • TournesolTournesol Membre
    15:20 modifié #9
    dans 1129274909:

    YES !  <3 :adios!:<br />
    Ben ça c'est cool, parce que tu vois je suis pas un as des firstResponder et de la responderChain, je n'ai jamais eu l'occasion de me plonger dedans vraiment, j'avais juste vaguement compris le concept sans jamais trop tester.  :brule:
    Du coup quand je t'ai écrit le message, je doutais un peu, Surtout quand fouf t'a répondu et ne t'a pas touché un mot sur le firstResponder.  :o
    Donc du coup si tu me dis qu'avec le principe des firstResponder ça fonctionne, je suis  :p happy  :p parce que ça veut aussi dire que j'ai bien capté le concept  :) ;)


    Je pense que c'est une bonne solution! Par contre, le NSDatePicker ne se masque que si je clique qqch qui accepte de devenir firstResponder, par exemple sur un NSTableView, un NSTextField, mais si je clique dans la fenêtre à  un endroit où il n'y a rien, le NSDatePicker ne disparaà®t pas. Bon, je pense que je pourrais sous-classer mon NSWindows pour qu'il puisse devenir firstResponder, mais pour l'instant je suis plutôt satisfait.  o:)
  • AntilogAntilog Membre
    15:20 modifié #10
    dans 1129284681:

    []

    Dans mon appli, j'ai un NSDatePicker au format texte, et à  côté un bouton qui permet d'afficher un NSDatePicker au format graphique. Mais comme ça prend de la place, j'aimerais qu'il disparaisse un fois que j'en ai plus besoin. Bon, je ne sais pas si c'est une solution très user friendly. Voici deux petites captures:
    image19ng.png image24ol.png

    En tout cas merci pour votre aide  :)


    Autant pour moi  >:)
    Présenté comme ça, avec la copie d'écran, ça me semble tout ce qu'il y a de 'macintoshement correct'
Connectez-vous ou Inscrivez-vous pour répondre.