web-dev-qa-db-fra.com

Exécuter une action lorsque la touche Entrée est enfoncée dans un champ NSTextField?

J'ai un petit problème en ce moment. Je veux exécuter une méthode lorsque la touche Entrée est enfoncée dans un NSTextField. L'utilisateur doit pouvoir saisir ses données et une méthode de calcul doit être exécutée dès qu'il appuie sur la touche Entrée.

61
TalkingCode

Vous pouvez le faire en définissant l'action du champ de texte. Dans IB, connectez le sélecteur de champ de texte à votre contrôleur ou à tout autre objet présentant l'IBAction que vous souhaitez utiliser.

Pour le définir dans le code, envoyez au NSTextField un setTarget: un message et un setAction: message. Par exemple, si vous définissez cela sur votre objet contrôleur dans le code et que votre sortie textField est appelée myTextField:

- (void)someAction:(id)sender
{
  // do something interesting when the user hits <enter> in the text field
}

// ...

[myTextField setTarget:self];
[myTextField setAction:@selector(someAction:)];
78
Jason Coco

Vous devez seulement faire cela

Pour certaines touches (Entrée, Suppression, Retour arrière, etc.)

self.textfield.delegate = self;

puis mettre en œuvre cette méthode

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
    NSLog(@"Selector method is (%@)", NSStringFromSelector( commandSelector ) );
    if (commandSelector == @selector(insertNewline:)) {
        //Do something against ENTER key

    } else if (commandSelector == @selector(deleteForward:)) {
        //Do something against DELETE key

    } else if (commandSelector == @selector(deleteBackward:)) {
        //Do something against BACKSPACE key

    } else if (commandSelector == @selector(insertTab:)) {
        //Do something against TAB key
    }

    // return YES if the action was handled; otherwise NO
} 
44
M.Shuaib Imran

La version Swift de la solution de @ M.ShuaibImran:

Sous-classe d'abord votre ViewController à: NSTextFieldDelegate

class MainViewController: NSViewController, NSTextFieldDelegate {
  ...
} 

Attribuez le délégué textField au ViewController dans votre viewDidLoad ():

self.textField.delegate = self

Incluez la méthode NSTextFieldDelegate qui gère les répondeurs clavier:

func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
    if (commandSelector == #selector(NSResponder.insertNewline(_:))) {
        // Do something against ENTER key
        print("enter")
        return true
    } else if (commandSelector == #selector(NSResponder.deleteForward(_:))) {
        // Do something against DELETE key
        return true
    } else if (commandSelector == #selector(NSResponder.deleteBackward(_:))) {
        // Do something against BACKSPACE key
        return true
    } else if (commandSelector == #selector(NSResponder.insertTab(_:))) {
        // Do something against TAB key
        return true
    } else if (commandSelector == #selector(NSResponder.cancelOperation(_:))) {
        // Do something against ESCAPE key
        return true
    }

    // return true if the action was handled; otherwise false
    return false
}
11
drdrdrdr

C'est très simple et vous pouvez le faire directement depuis l'éditeur d'interface utilisateur

  1. Cliquez avec le bouton droit sur le texte Feild, faites glisser la référence Action vers le bouton comme indiqué ci-dessous dans la capture d'écran

enter image description here

  1. Maintenant, il vous donnera une option comme indiqué dans la capture d'écran ci-dessous, vous devez sélectionner effectuer un clic

enter image description here

  1. Maintenant, ça devrait ressembler à ça

enter image description here

Remarque: L'événement sera déclenché dès que vous appuyez sur la touche Tab ou Enter. Dans le cas où vous souhaitez que l'action ne soit déclenchée que lorsque l'utilisateur appuie sur la touche Enter, vous devez alors définir un paramètre. Allez dans le Attribute inspector et remplacez la propriété Action par Send on Enter only comme illustré dans la capture d'écran ci-dessous

enter image description here

10
Vikas Bansal

NSTextFieldDelegate's - control:textView:doCommandBySelector: est votre ami.

Cherchez le insertNewline: commande.

4
iljawascoding

Dans Interface Builder - cliquez sur votre NSTextField, allez dans l'éditeur de connexions, faites glisser le sélecteur vers votre objet contrôleur - vos actions devraient arriver!

1
Daniel Morris

La meilleure façon de le faire est de lier la valeur NSTextField à la propriété NSString.

Par exemple, définissez une méthode:

(void)setTextFieldString:(NSString *)addressString {}

ajouter des liaisons:

[textField bind:@"value" toObject:self withKeyPath:@"self.textFieldString" options:nil];

Entrez n'importe quel texte et appuyez sur la touche Entrée, setTextFieldString sera appelé.

1
Sathish Kumar