UITextField perdre événement de mise au point
-
16-09-2019 - |
Question
J'ai un UITextField dans une classe MyCustomUIView et quand le UITextField perd le focus, je voudrais cacher le terrain et montrer quelque chose d'autre en place.
Le délégué du UITextField
est réglé sur MyCustomUIView
via IB et j'ai aussi « ai fini sur la sortie » et « édition a mis un terme » événements pointant vers une méthode IBAction
au sein MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
Cependant, aucun de ces événements semblent se faire virer quand le UITextField perd le focus. Comment avez-vous piège / regardez pour cet événement?
Le délégué du UITextField
est défini comme MyCustomUIView
donc je reçois un message de textFieldShouldReturn
pour masquer le clavier lorsque vous avez terminé.
Mais ce que je suis aussi intéressé est de trouver lorsque l'utilisateur appuie sur une autre zone de l'écran (par exemple un autre contrôle ou juste zone vide) et le champ de texte a perdu le focus.
La solution
Je crois que vous devez désigner votre point de vue en tant que délégué UITextField comme ceci:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
En prime, voici comment vous obtenez le clavier pour aller loin quand ils appuient sur le « fait » ou le retour des boutons, selon la façon dont vous avez défini cette propriété:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
//This line dismisses the keyboard.
[theTextField resignFirstResponder];
//Your view manipulation here if you moved the view up due to the keyboard etc.
return YES;
}
Autres conseils
Essayez d'utiliser délégué pour la méthode suivante:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Cela a fonctionné pour moi.
Le problème avec la solution resignFirstResponder uniquement est, qu'il ne peut être déclenchée que par un explicite clavier ou UITextField événement. Je cherchais aussi un « événement de mise au point perdue » pour masquer le clavier, si quelque part en dehors du champ de texte a été tapé sur. La seule « solution » à proximité et pratique je suis tombé est, pour désactiver les interactions pour d'autres vues jusqu'à ce que l'utilisateur est terminé avec l'édition (coups Achevée / retour sur le clavier), mais toujours être en mesure de sauter entre les champs de texte pour faire des corrections sans la nécessité de glisser hors et dans le clavier à chaque fois.
L'extrait suivant peut-être utile à quelqu'un, qui veut faire la même chose:
// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {
for(UIView *v in [(UIView*)sender superview].subviews)
if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}
// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {
[(UIResponder*)sender resignFirstResponder]; // hide keyboard
for(UIView *v in [(UIView*)sender superview].subviews)
v.userInteractionEnabled = YES;
}
Vous pourriez avoir à sous-classe et la UITextField
passer outre resignFirstResponder
. resignFirstResponder
sera appelé comme le champ de texte perd le focus.
Je pense que vous avez mis en œuvre UIKeyboardDidHideNotification
et dans ce cas, vous
utiliser le code comme
[theTextField resignFirstResponder];
supprimer ce code.
également même écriture de code dans la méthode de textFieldShouldReturn
. cette orientation a également perdu.
Pour ceux qui luttent avec cela dans Swift. Nous ajoutons un geste de reconnaissance à la vue du ViewController de sorte que lorsque la vue est exploité, nous rejetons le champ de texte. Il est important de ne pas annuler les clics ultérieurs sur la vue.
Swift 2.3
override func viewDidLoad() {
//.....
let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
//this line is important
viewTapGestureRec.cancelsTouchesInView = false
self.view.addGestureRecognizer(viewTapGestureRec)
//.....
}
func handleViewTap(recognizer: UIGestureRecognizer) {
myTextField.resignFirstResponder()
}