NSResponder et clavier

beltbelt Membre
19:20 modifié dans API AppKit #1
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 ?

Réponses

  • fouffouf Membre
    19:20 modifié #2
    Un outlet vers ta vue puis tu appelles [maVue keyDown:event] ? C'est p-e un peu du bidouillage ca.
  • beltbelt Membre
    19:20 modifié #3
    J'avais envisager d'utiliser la methode nextResponder. A quoi sert-elle exactement ?
  • ChachaChacha Membre
    19:20 modifié #4
    Salut belt,

    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
Connectez-vous ou Inscrivez-vous pour répondre.