Action lors d'un clic n'importe où dans la fenêtre
Tournesol
Membre
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+
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+
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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à
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):
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:
- dans MyDatePicker.m, j'ai écrit:
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:
En tout cas merci pour vos messages! ça m'a vraiment beaucoup aidé!
Dans ma classe MyDatePicker, il fallait réécrire la méthode
- (BOOL)acceptsFirstResponder
pour qu'elle renvoie YES
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.
Donc du coup si tu me dis qu'avec le principe des firstResponder ça fonctionne, je suis happy parce que ça veut aussi dire que j'ai bien capté le concept
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:
En tout cas merci pour votre aideÂ
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.
Autant pour moiÂ
Présenté comme ça, avec la copie d'écran, ça me semble tout ce qu'il y a de 'macintoshement correct'