4

J'écris ma première application Cocoa. C'est une application utilitaire simple - une calculatrice. J'ai tout ce qui fonctionne, la dernière chose que je veux ajouter est que je veux que l'application réponde aux événements clés de la presse. Donc, vous pouvez cliquer sur le bouton "4" avec la souris, ou vous pouvez simplement appuyer sur la touche "4" sur le clavier. Je suis en train de lire toute la documentation de gestion des événements, mais je ne suis pas sur l'approche recommandée pour obtenir un NSResponder (ou NSView) qui gère l'événement.Meilleure pratique pour répondre à l'événement keyDown

Je peux créer une sous-classe de NSWindow et indiquer au constructeur d'interface de créer la fenêtre principale de ce type. Ensuite, lorsque je remplace le message keyDown dans ma nouvelle sous-classe NSWindow, il obtient les événements, mais je ne sais pas comment le connecter à ma classe de délégué d'application (puisque je veux simplement activer la touche et appeler le message correspondant dans le délégué que le bouton «sélectionner» cibles d'actions

Ou, je pense que j'ai entendu quelque chose à propos de cela en changeant la super classe de la classe de délégué d'application de NSObject à NSView, ou NSResponder ou quelque chose. piqué à cette idée beaucoup, mais je ne suis pas sûr de savoir comment réellement obtenir l'objet délégué de l'application, puis mis en place en tant que premier répondeur (je pense que c'est ce que je voudrais faire)

Donc, je suis En espérant que quelqu'un puisse me donner des instructions spécifiques sur comment/où je devrais implémenter mon keyDown m ethod, mais j'aimerais aussi comprendre quelle est la «meilleure pratique» recommandée pour ce faire. Que dirait Apple, est la bonne architecture pour faire cela? Je suis tout aussi intéressé à apprendre comment faire ce travail que d'apprendre le modèle de conception d'Apple derrière elle.

La structure de mon programme est la suivante: J'ai un fichier nib (actuellement un .xib) où j'ai conçu ma fenêtre avec une zone de texte pour l'affichage et une poignée de boutons. J'ai enregistré des points de vente et des actions à partir de là à la classe AppDelegate (celle que le modèle de projet standard met en place pour vous). Suivant le modèle MVC, j'ai alors une classe Calculator que AppDelegate initialise et toute la logique actuelle de la calculatrice est dans cette classe. L'AppDelegate répond simplement aux messages des boutons, les transmet aux méthodes de la classe Calculator, puis demande à la Calculatrice la valeur d'affichage actuelle et la met à jour dans la zone de texte. Ainsi, les éléments graphiques dans mon fichier nib sont la "vue", AppDelegate est le "controler" et la classe Calculator est le "modèle". Droite?

Alors, qui est censé gérer les événements keyDown? On dirait que la vue devrait les capturer et les envoyer au contrôleur, mais comment puis-je configurer cela?

Je suppose qu'une question potentiellement connexe est que j'ai vu des mentions des classes «contrôleur de fenêtre» et «contrôleur de vue». Je ne suis pas sûr de comprendre le but de ces cours. Est-ce que mon application simple en a? Devrait-il?

Répondre

3

Utilisez la méthode setKeyEquivalent: de NSButton ou définissez l'équivalent de clé pour chaque bouton dans le constructeur d'interface.

Je ne suis pas sûr de la façon « appropriée » pour ce faire, mais la gestion des événements clé personnalisée peut être mis dans une fenêtre personnalisée contentView comme ceci:

- (void)keyDown:(NSEvent *)theEvent { 
    NSLog(@"keyDown:%@", theEvent); 

    //Put event handling code here. 

    [super keyDown:theEvent]; 
} 

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

Si quelqu'un connaît la bonne façon de faire cela, n'hésitez pas à entrer.

+0

Merci, cela semble être la meilleure réponse à ma question spécifique. Je suis toujours curieux à propos de la réponse à ma question plus générale sur ce que le bon motif de conception est pour remplacer la méthode keyDown. –

+0

P.S. Cela résout pour presque tous les boutons. Je fais une "calculatrice de programmeur" donc quelques-uns de mes boutons sont des opérateurs à deux caractères comme "<<".Donc, j'allais personnaliser ma méthode keyDown pour détecter les deux caractères d'affilée. Je veux également répondre à une pâte en entrant tous les caractères collés comme des commandes à la calculatrice afin que vous puissiez copier et coller une expression pour obtenir un calcul - mais je suppose que travailler avec copier et coller est une bête complètement différente. –

+0

Voir les modifications de la réponse. – spudwaffle