NSResponder et clavier
belt
Membre
La fenêtre de mon application comporte :
- une matrice (NSMatrix) de boutons (NSButtonCell) dont certains ont un équivalent clavier (aucun objet éditable)
- une vue personalisée (héritant de NSView), la méthode acceptFirstResponder étant surchargée et retourne YES. La méthode keyDown est également surchargée.
La matrice est définie comme initialfirstresponder de la fenêtre (dans Project Builder)
J'aimerais que les entrées clavier qui ne sont pas prises en charge par NSmatrix (c'est à dire les touches qui ne sont pas l'équivalent clavier d'un bouton) le soient par la vue personalisée (via la méthode keyDown)
Comment faire ?
- une matrice (NSMatrix) de boutons (NSButtonCell) dont certains ont un équivalent clavier (aucun objet éditable)
- une vue personalisée (héritant de NSView), la méthode acceptFirstResponder étant surchargée et retourne YES. La méthode keyDown est également surchargée.
La matrice est définie comme initialfirstresponder de la fenêtre (dans Project Builder)
J'aimerais que les entrées clavier qui ne sont pas prises en charge par NSmatrix (c'est à dire les touches qui ne sont pas l'équivalent clavier d'un bouton) le soient par la vue personalisée (via la méthode keyDown)
Comment faire ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
j'ai regardé ton problème, mais je n'arrive pas à faire ce que tu veux.
Je te livre quand même ce que je crois savoir:
Le initialFirstResponder est le premier objet qui aura le focus lors du chargement de la fenêtre
Le nextkeyView (toujours dans IB) permet de spécifier dans quel ordre les éléments reçoivent le focus quand on appuie sur tabulation. Mais ça n'a pas de rapport avec ton schmilblik.
Pour être sûr du premier élément de la responder chain, le "initialFirstResponder" ne suffit pas toujours, j'ai un programme où je suis obligé de faire un "makeFirstResponder" à la main.
Sinon, là où tu as raison, c'est sur l'utilisation de nextResponder, ou plutôt setNextResponder. C'est effectivement par cette méthode que tu peut indiquer un ordre particulier dans lequel le programme teste les éléments lors d'un événement, jusqu'à ce qu'il en trouve un qui réponde.
Dans ton cas, supposons que ta matrice s'appelle "m" et ta vue "v".
Quelque part dans le code (genre le awakeFromNib ou le windowControllerDidLoadNib du document), tu aurais:
NSWindow* window = ...la fenêtre...
[window makeFirstResponder:m];
[m setNextResponder:v];
Ainsi, si tu déclenches un événement non intercepté par "m", c'est "v" qui va le récupérer, et la transmettre encore s'il n'en fait rien.
Mais en pratique... je n'ai pas vraiment réussi à le faire fonctionner comme tu voudrais. Quand j'appuie sur une touche qui n'est *pas* un "key equivalent" d'une cellule de la matrice, "v" récupère bien l'événement dans son "keyDown". Par contre, si j'appuie sur une touche qui *est* un key Equivalent des cellules de la matrice, et bien c'est encore "v" qui récupère, la matrice n'a rien vu.
Par contre, ça marche si le "Key Equivalent" n'est pas une simple touche, mais une combinaison Pomme+kêkchose.
Désolé de pas pouvoir plus t'aider pour le moment. Il faut peut-être regarder du côté des "performKeyEquivalent".
+
Chacha