delegate ios objective-c uitextfield uitextfielddelegate

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í.