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.
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:)];
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
}
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
}
C'est très simple et vous pouvez le faire directement depuis l'éditeur d'interface utilisateur
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
NSTextFieldDelegate
's - control:textView:doCommandBySelector:
est votre ami.
Cherchez le insertNewline:
commande.
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!
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é.