ios - uitextfield delegate swift
UITextField perder el evento de enfoque (6)
Creo que has implementado UIKeyboardDidHideNotification
y en este caso,
usar código como
[theTextField resignFirstResponder];
eliminar este código
También el mismo código escribe en el método textFieldShouldReturn
. esto también perdió el foco.
Tengo un UITextField en una clase de MyCustomUIView y cuando el UITextField pierde el foco, me gustaría ocultar el campo y mostrar algo más en su lugar.
El delegado para el UITextField
se establece en MyCustomUIView
través de IB y también tengo eventos ''Did End On Exit'' y ''Editing Did End'' que apuntan a un método MyCustomUIView
dentro de MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
Sin embargo, ninguno de estos eventos parece ser activado cuando el UITextField pierde el enfoque. ¿Cómo atrapar / buscar este evento?
El delegado para el UITextField
se configura como MyCustomUIView
por lo que recibo el mensaje textFieldShouldReturn
para descartar el teclado cuando textFieldShouldReturn
.
Pero lo que también me interesa es saber cuándo el usuario presiona alguna otra área en la pantalla (digamos otro control o simplemente un área en blanco) y el campo de texto ha perdido el foco.
Creo que necesita designar su vista como un delegado de UITextField así:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
Como bono adicional, así es como el teclado desaparece cuando se presionan los botones "listo" o de retorno, según cómo haya configurado esa 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;
}
El problema con la solución resignFirstResponder únicamente es que solo se puede desencadenar mediante un teclado explícito o un evento UITextField . También estaba buscando un "evento de foco perdido" para ocultar el teclado, si se tocaba en algún lugar fuera del campo de texto. La única "solución" cercana y práctica que encontré es, deshabilitar las interacciones para otras vistas hasta que el usuario termine de editar (hacer clic / regresar en el teclado) pero aún así poder saltar entre los campos de texto para hacer correcciones sin La necesidad de deslizarse hacia fuera y en el teclado cada vez.
El siguiente fragmento de código puede ser útil para 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;
}
Es posible que tenga que subclasificar el UITextField
y anular resignFirstResponder
. resignFirstResponder
llamará resignFirstResponder
justo cuando el campo de texto está perdiendo el foco.
Para aquellos que luchan con esto en Swift. Agregamos un reconocedor de gestos a la vista ViewController, de modo que cuando se toca la 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()
}
Trate de usar delegado para el siguiente método:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Eso funcionó para mí.