¿Cómo puedo responder a los events táctiles en un UITextField?

Quiero responder a los events táctiles (específicamente UIControlEventTouchUpInside y UIControlEventTouchUpOutside ) en un UITextField , pero el único evento que ocurre es UIControlEventTouchCancel .

No puedo usar UIControlEventEditingDidBegin , porque solo ocurre cuando el campo se concentra, lo cual no es lo que bash detectar. Quiero saber cuándo el usuario levanta el dedo, y si estaba dentro o fuera del campo de text, independientemente del estado de enfoque actual.

¿Alguien sabe una forma de lograr esto?

Para ser claro, he intentado usar addTarget:action:forControlEvents y no funciona . El evento de retoque se evita mediante la cancelación. Quiero una manera de detectar el retoque antes de que UITextField consum y produzca el evento Cancel.

Además, me gustaría evitar crear vistas adicionales si es posible.

Bueno, una ronda sobre cómo hacerlo sería crear un button UIB con el set de relleno para borrar para cubrir todo el espacio, y un UITextField encima. Si el usuario toca el campo de text, el campo de text debe enviar un evento, y si el usuario toca fuera del campo de text, el button UIB enviará el evento.

Buena respuesta aquí: Cambiar los events táctiles pnetworkingeterminados para UITextField

Use el delegado del campo de text y haga lo que quiera hacer en textFieldShouldBeginEditing:

Puede devolver NO para evitar el comportamiento pnetworkingeterminado.

Puede crear una categoría para UiView y anular el touchesBegan meathod de la siguiente manera.

Está funcionando bien para mí. Y es la solución centralizada para este problema.

 #import "UIView+Keyboard.h" @implementation UIView(Keyboard) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.window endEditing:true]; [super touchesBegan:touches withEvent:event]; } @end 

Hoy me he enfrentado a este problema. Mi objective era cambiar el color de background del campo de text al presionar hacia abajo y volver a habilitarlo al retocar / cancelar. Es extraño que el toque hacia abajo se envíe a destino desde UITextField, pero retocar el interior, retocar el exterior e incluso tocar cancelar no lo están. Encontré la solución. Es simple. Simplemente cree una subclass de UITextField y sobrescriba touchesEnded: y toque Canceled :.

 @interface TextField : UITextField @end @implementation CuteTextField - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ [super touchesEnded:touches withEvent:event]; self.backgroundColor=GetDefaultBackgroundColor(); } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ [super touchesCancelled:touches withEvent:event]; self.backgroundColor=GetDefaultBackgroundColor(); } @end 

Agregue un objective para su evento deseado de manera progtwigda, o use IB.

 UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)]; [touchyTextField addTarget:self action:@selector(yourDesinetworkingMethod) forControlEvents:UIControlEventTouchUpInside];