Je sais que je dois indiquer à mon UITextField de renvoyer le premier intervenant lorsque je veux désactiver le clavier, mais je ne sais pas comment savoir si l'utilisateur a appuyé sur la touche "Done" du clavier. Existe-t-il une notification que je peux surveiller ?
Réponses
Trop de publicités?Swift 4.2
et il fonctionnera à 100 %.
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
Vous pouvez également utiliser
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
La meilleure solution si vous avez de nombreux Uitextfields :
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Vous remarquerez que la méthode "textFieldShouldReturn" fournit l'objet champ de texte qui a appuyé sur la touche DONE. Si vous définissez le TAG, vous pouvez activer ce champ de texte. Vous pouvez également suivre et comparer le pointeur de l'objet avec une valeur membre stockée par son créateur.
Mon approche est la suivante pour un auto-apprentissage :
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
Entre-temps, j'ai mis en place le test de "validation" qui refuse la démission. Il s'agit uniquement d'une illustration, donc si l'utilisateur tape NON ! dans le champ, il n'y aura pas de démission. Le comportement est conforme à ce que je voulais, mais la séquence de sortie n'est pas celle que j'attendais.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
Voici la sortie de mon NSLog pour ce refus, suivie de l'acceptation. Vous remarquerez que je renvoie le résultat de la résignation, mais je m'attendais à ce qu'il me renvoie FALSE pour que je puisse le rapporter à l'appelant ! A part cela, il a le comportement nécessaire.
13.313 StudyKbd\[109:207\] -\[StudyKbdViewController textFieldShouldReturn:\]
13.320 StudyKbd\[109:207\] -\[StudyKbdViewController textFieldShouldEndEditing:\]
13.327 StudyKbd\[109:207\] NO!
13.333 StudyKbd\[109:207\] -\[StudyKbdViewController textFieldShouldReturn:\]: did resign the keyboard
59.891 StudyKbd\[109:207\] -\[StudyKbdViewController textFieldShouldReturn:\]
59.897 StudyKbd\[109:207\] -\[StudyKbdViewController textFieldShouldEndEditing:\]
59.917 StudyKbd\[109:207\] -\[StudyKbdViewController doneEditText\]: NO
59.928 StudyKbd\[109:207\] -\[StudyKbdViewController textFieldShouldReturn:\]: did resign the keyboard
2 votes
[self.view endEditing:YES] ; en touches commence le délégué est la meilleure solution