Question

J'apprends lentement Objective-C et Cocoa, et la seule façon que je vois jusqu'à présent de capturer les événements clés dans les vues de texte est d'utiliser la délégation, mais j'ai du mal à trouver une documentation utile et des exemples sur la façon de mettre en œuvre une telle solution.Quelqu'un peut-il m'orienter dans la bonne direction ou me fournir une aide directe ?

Était-ce utile?

La solution

Généralement, la façon dont vous l'implémentez consiste simplement à ajouter la fonction requise au contrôleur de votre vue et à définir son délégué.Par exemple, si vous souhaitez que le code s'exécute lors du chargement de la vue, il vous suffit de déléguer votre vue au contrôleur et d'implémenter la fonction awakeFromNib.

Ainsi, pour détecter une pression sur une touche dans une vue texte, assurez-vous que votre contrôleur est le délégué de la vue texte, puis implémentez ceci :

- (void)keyUp:(NSEvent *)theEvent

Notez qu'il s'agit d'une méthode NSResponder héritée, et non d'une méthode NSTextView.

Autres conseils

Juste un conseil pour la coloration syntaxique :

Ne mettez pas en surbrillance l'ensemble du texte en même temps - c'est très lent.Ne mettez pas non plus en surbrillance le dernier texte modifié à l'aide de -editedRange - c'est également très lent si l'utilisateur colle un grand corps de texte dans la vue texte.

Au lieu de cela, vous devez mettre en surbrillance le texte visible, ce qui se fait comme ceci :

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];

Ensuite, vous alimentez visibleRange dans votre code de surbrillance.

Il est important de nous dire ce que vous essayez réellement d'accomplir : l'objectif de niveau supérieur que, selon vous, la capture des événements clés dans un NSTextView permettra d'atteindre.

Par exemple, lorsque quelqu'un me demande comment capturer les événements clés dans un NSTextChamp ce qu'ils veulent vraiment savoir, c'est comment valider les entrées sur le terrain.Cela se fait en définissant le formateur du champ sur une instance de NSFormatter (que ce soit l'un des formateurs inclus dans Cocoa ou un formateur personnalisé), et non en traitant directement les frappes au clavier.

Alors, étant donné cet exemple, qu’essayez-vous réellement d’accomplir ?

J'ai fait des recherches approfondies et j'ai trouvé une réponse à ma propre question.J'y reviendrai ci-dessous, mais merci aux deux gars qui ont répondu.Je pense que Stack Overflow est déjà un site fantastique - j'espère que davantage de développeurs Mac trouveront leur chemin une fois la version bêta terminée - cela pourrait être une excellente ressource pour d'autres développeurs souhaitant passer à la plate-forme.

J'ai donc, comme suggéré par Danny, trouvé ma réponse dans la délégation.Ce que je n'ai pas compris dans le message de Danny, c'est qu'il existe un ensemble de méthodes activées par les délégués dans l'objet de délégation et que le délégué doit implémenter lesdits événements.Et donc pour un TextView, j'ai pu trouver la méthode textDidChange, qui a accompli ce que je voulais d'une manière encore meilleure que la simple capture des pressions sur les touches ne l'aurait fait.Donc si j'implémente ceci dans mon contrôleur :

- (void)textDidChange:(NSNotification *)aNotification;

Je peux répondre au texte en cours d'édition.Il existe bien sûr d'autres méthodes disponibles, et je suis ravi de jouer avec elles, car je sais que j'apprendrai beaucoup de choses en le faisant.Merci encore les gars.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top