UITextField perder el evento de foco
-
16-09-2019 - |
Pregunta
Tengo una UITextField en una clase MyCustomUIView y cuando el UITextField pierde el foco, me gustaría ocultar el campo y mostrar otra cosa en su lugar.
El delegado para la UITextField
se establece en MyCustomUIView
vía EB y también tengo 'puso fin al salir' y 'Edición puso fin a' eventos que apuntan a un método IBAction
dentro MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
Sin embargo, ninguno de estos acontecimientos parecen ser despedido cuando el UITextField pierde el foco. ¿Cómo se trampa / mira para este evento?
El delegado para la UITextField
se establece como MyCustomUIView
así que estoy recibiendo mensajes textFieldShouldReturn
para ocultar el teclado cuando haya terminado.
Pero lo que también me interesa es averiguar cuando el usuario pulsa alguna otra área en la pantalla (por ejemplo otro control o simplemente área en blanco) y el campo de texto se ha perdido el foco.
Solución
Creo que necesita para designar a la vista como delegado UITextField este modo:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
Como bono adicional, esta es la forma de obtener el teclado desaparezca cuando presionan el "hecho" o regresar botones, dependiendo de cómo se haya establecido que la propiedad:
- (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;
}
Otros consejos
Trate de usar delegado por el siguiente método:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Eso funcionó para mí.
El problema con el solución resignFirstResponder únicamente es decir, que sólo puede ser activado por una explícita Teclado o UITextField evento. Yo también estaba buscando un "evento de foco perdida" para ocultar el teclado, si en algún lugar fuera del campo de texto se dio un golpecito en. La única "solución" estrecha y práctica me encontré es decir, para desactivar las interacciones de otros puntos de vista hasta que el usuario ha terminado con la edición (golpear hecho / retorno en el teclado), pero aún sea capaz de saltar entre los campos de texto para hacer correcciones sin la necesidad de deslizarse hacia fuera y en el cada vez de teclado.
El siguiente fragmento que puede resultar útil a alguien, que quiere hacer lo mismo:
// 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;
}
Puede que tenga que subclase el UITextField
y anular resignFirstResponder
. resignFirstResponder
se llamará igual que el campo de texto está perdiendo el foco.
creo que haya implementado UIKeyboardDidHideNotification
y en este caso usted
utilice un código como
[theTextField resignFirstResponder];
eliminar este código.
También mismo código de escritura en el método textFieldShouldReturn
. este enfoque también se pierde.
Para aquellos que luchan con esto en Swift. Añadimos un reconocedor gesto a la opinión del ViewController de modo que cuando se toca el punto de vista descartamos el campo de texto. Es importante no cancelar los clics posteriores en la vista.
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()
}