NSResponder affichage d'un menu (Anciennement NSResponder et les clics secondaires)
Thibaut
Membre
J'ai une sous-classe de NSResponder qui a besoin d'afficher un menu contextuel en cas de clic secondaire.
Réimplémenté la méthode rightMouseDown: aurait été trop simple. Apple a décidé de faire plus compliqué que cela.
Si je fais CTRL+Clic, ça passe dans mouseDown:.
Si je pose deux doigts sur mon trackpad et clic, il ne passe dans aucune des deux méthodes.
Je n'ai pas de souris sur moi, mais je suppose que si je fais un clic droit, rightMouseDown: sera appelé ?
Y a-t-il un moyen de capturer facilement tous les types de clics secondaires ?
Réimplémenté la méthode rightMouseDown: aurait été trop simple. Apple a décidé de faire plus compliqué que cela.
Si je fais CTRL+Clic, ça passe dans mouseDown:.
Si je pose deux doigts sur mon trackpad et clic, il ne passe dans aucune des deux méthodes.
Je n'ai pas de souris sur moi, mais je suppose que si je fais un clic droit, rightMouseDown: sera appelé ?
Y a-t-il un moyen de capturer facilement tous les types de clics secondaires ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cette logique a du sens: on pourrait imaginer qu'une nouvelle version d'OS X décide que le menu s'affiche quand on met trois doigts sur le trackpad, ou un truc comme ça. Avec la technique d'Apple, ça fonctionnera.
Regarde le chapitre Displaying a Contextual Menu de Application Menu and Pop-up List Programming Topics.
A priori (jamais essayé), il n'y a qu'à appeler setMenu: sur la NSView, on peut même le faire dans le XIB.
J'ai un NSTextField désactivé dans mon NSResponder. Je pense que c'est lui qui doit poser problème.
menuForEvent:
Overridden by subclasses to return a context-sensitive pop-up menu for a given mouse-down event.
- ([url="file:///Xcode2.5/ADC%20Reference%20Library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSMenu_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSMenu"]NSMenu[/url] *)menuForEvent:([url="file:///Xcode2.5/ADC%20Reference%20Library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSEvent"]NSEvent[/url] *)theEvent
Parameters
theEvent
An object representing a mouse-down event.
Discussion
The receiver can use information in the mouse event, such as its location over a particular element of the receiver, to determine what kind of menu to return. For example, a text object might display a text-editing menu when the cursor lies over text and a menu for changing graphics attributes when the cursor lies over an embedded image.
The default implementation returns the receiver's normal menu
(À la limite, je n'ai même pas besoin que ça passe en firstResponder, mais que ça affiche tout de même le menu.)
Il faut aussi retourner YES dans - (BOOL)acceptsFirstResponder
Sinon tu le fais directement dans rightMouseDown:
Il y a quelques bugs sur les keyView, mais ce n'est pas ce qui m'importe pour le moment.
En gros, dans ma vue Custom, dès que je fais "entrer" dans le texteField, il se désactive (et sera certainement remplacé par un autre textField).
La vue devient alors firstResponder. Si l'on fait Delete, le textField redevient éditable (dans ma vraie application, la vue complète sera supprimée). Mais je veux pouvoir faire un delete avec la souris, grâce à un menu contextuel.
Edit:
Du coup, le moyen de résoudre mon problème est :
- Soit d'attribuer le menu à l'imageView
- Soit de changer le type de ma vue en imageView et retirer celle à l'interieur.
Cependant, le ctrl+clic ne fonctionne toujours pas.
Edit 2:
Dans mouseDown:
Mais je ne trouve pas ça très propre...