12
votes

Nstextfield Entrez pour déclencher une action

Je cherche partout pour un exemple simple de comment avoir une action (ou un bouton) être déclenché lorsque la touche Entrée est touchée dans le champ de texte.

Devrais-je sous-classer le champ de texte? Aurais-je besoin de créer un délégué pour appeler l'action dont j'ai besoin? Existe-t-il un moyen d'attraper l'événement dans ma classe de contrôleur de la fenêtre principale?

Si vous pouviez même me signaler à la bonne direction qui serait géniale. Merci.


0 commentaires

5 Réponses :


2
votes

Connectez simplement une ibaction de votre classe de contrôleur avec un champ de texte. L'action doit être appelée avec vous appuyez sur Entrée ou laissez le champ de texte avec un onglet ou une souris.


0 commentaires

9
votes

Pour obtenir une action après avoir appuyé sur Entrée, écrivez simplement une ibaction dans votre contrôleur de fenêtre et connectez-vous à votre champ de texte. Si vous souhaitez plus que votre méthode soit appelée lorsque vous vous concentrez sur le champ de texte et laissez le champ de texte, vous devez définir le délégué ( Voir ici ).


5 commentaires

Bonjour, merci, je l'ai fait, mais comment puis-je filtrer pour la clé Entrée car lorsqu'il s'agit de la concentration ou de la flou du champ de texte, l'action est également déclenchée. Merci


Pour obtenir une notification lorsque l'édition est terminée (entrez la clé de la clé ou de l'onglet est touchée), la méthode du délégué Class ControlTextDidIdIting est appelée, vous pouvez déclencher l'action. Si vous souhaitez que votre action soit déclenchée pour seulement entrer la touche Entrée, vous devez écrire des formateurs personnalisés ou une classe NStextField personnalisée.


Merci Gudda. En fait, je viens de découvrir que vous pouvez envoyer l'action uniquement sur ENTER comme décrit ici: mojomonkeycoding.com/2009/11/14/... . Do Heureusement pas besoin de sous-classe.


Le site Web de MojomonkeyCoding.com est maintenant mort, une vraie honte. Finalement, j'ai trouvé un moyen de le faire proprement en code - sans sous-classement - C.F. ma réponse ci-dessous.


Que Dieu te bénisse! Tu as sauvé ma santé mentale



22
votes

Le site qui est référencé dans les commentaires à la réponse acceptée ... est maintenant "suspendu" par le Webhost et Google Cache n'a pas la capture d'écran contenant l'étape clé.

Donc, voici une alternative Solution J'ai trouvé que:

  1. fonctionne parfaitement
  2. ne nécessite pas de sous-classement

    Pour certaines touches (Entrez, Supprimer, BackSpace, etc.), Apple n'invoque pas la commande normale ControlTextDIDEDIVENTION: ETC. Au lieu de cela, Apple fait des sélecteurs individuels pour chaque clé de magie - mais il existe une méthode que vous pouvez utiliser pour l'intercepter.

    Documents officiels d'Apple ici:

    https: // développeur .apple.com / Bibliothèque / Mac / Documentation / TextFont / Conceptuel / CocoatoxEtchitecture / TextDitage / TextDIting.HTML # // Apple_ref / Doc / UID / TP40009459-CH3-SW31

    ... Mais dans le cas où Vanishes / se déplace, ajoutez cette méthode dans votre délégué: xxx

    dans mon cas, je voulais aussi remplacer la clé de retour arrière - exécutant l'application avec cette méthode , J'ai reçu la production disant que le sélecteur était "deletebackward:", j'ai donc ajouté une autre déclaration IF à réagir à cela.


1 commentaires

FYI, si vous voulez attraper la touche Entrée lorsque la fenêtre contextuelle de l'achèvement de NstextView est ouverte, cette méthode ne fonctionnera pas car DocommandBySelector: Ne vous invoque pas. Au lieu de cela, vous pouvez simplement regarder pour [[NsApp Curecrovent] .charactersignorSmodificateurs ISequaltostring: @ "\ r"] dans ControlTextDidchange:



1
votes

Pour le curieux, voici comment implémenter -ControltextDidenseting: (NOTIFICATION) obj code> (Si vous ne vous souciez pas de répondre à la touche Entrée)

appdelegate.h: p >

@synthesize myTextField = _myTextField;
@synthesize myButton = _myButton;

// Make yourself the delegate
- (void)applicationDidFinishLoading:(NSNotification *)aMessage {
    _myTextField.delegate = self;
}

// NSTextField objects send an NSNotification to a delegate if
// it implements this method:

- (void)controlTextDidEndEditing:(NSNotification *)obj {
    if ([[obj object] isEqual:_textField]) {
        [self myButtonPressed:nil]; // nil = sender
    }
}


0 commentaires

1
votes

La meilleure chose à faire serait d'utiliser Control + glisser à l'action que vous avez déjà créée, alors appuyez sur retour déclenchera également l'action.


1 commentaires

Oui. De plus, vous pouvez (si votre constructeur d'interface n'est pas très Old), sélectionnez votre NSTextField, ouvrez l'inspecteur des attributs et modifiez l'action en "Envoyer sur Entrée uniquement" au lieu de "Envoyer l'édition finale". ; Cela facilite le comportement de NstextField correctement, par exemple un champ d'URL pour un navigateur Web.