2012-01-10 27 views
18

Quiero responder a eventos táctiles (específicamente UIControlEventTouchUpInside y UIControlEventTouchUpOutside) en un UITextField, pero el único evento que aparece es UIControlEventTouchCancel.¿Cómo puedo responder a eventos táctiles en un UITextField?

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

¿Alguien sabe una manera de lograr esto?

Para ser claros, he intentado usar addTarget:action:forControlEvents y no funciona. El evento de retoque es impedido por la cancelación. Quiero una forma de detectar el retoque antes de el UITextField lo consume y produce el evento Cancelar.

Además, me gustaría evitar la creación de vistas adicionales si es posible.

Respuesta

-1

Agregue un objetivo para su evento deseado programáticamente o, use IB.

UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)]; 

[touchyTextField addTarget:self 
        action:@selector(yourDesiredMethod) 
      forControlEvents:UIControlEventTouchUpInside]; 
+7

No, eso definitivamente no funciona. Lo primero que intenté. El método "yourDesiredMethod" nunca se llama. Puedo obtener eventos para UIControlEventTouchDown, pero ninguno de los eventos TouchUp se activa. En su lugar, se dispara un evento UIControlEventTouchCancel. Tampoco puedo usar ese evento como un proxy hacky para el evento que quiero tampoco, porque también se activa cuando la pulsación larga abre el ciclo de ampliación y cuando algo más cancela la entrada del usuario, como un diálogo modal o la pantalla de bloqueo . – theK42

+0

Guau, supuse que funcionaría como cualquier otra clase basada en UIView. Puede crear un UITextField personalizado y anular el método touchesBegan: garantizar que se convierta en el primer respondedor en casos adecuados para que el teclado siga apareciendo. –

+0

Así que traté de sobrepasar los toques de BeGo/Ended/Cancelled, y eso también me dio un par de Began/Cancelled, sin evento de finalización. ¡Esto es realmente frustrante! Además, anular esos métodos no impidió que textField se convirtiera en el primer respondedor, por lo que la clase base está haciendo el manejo táctil antes de que tenga la oportunidad. – theK42

4

bien una manera indirecta de hacerlo sería crear un UIButton con el relleno establecido para borrar para cubrir todo el espacio, y una UITextField en la parte superior de la misma. Si el usuario toca en el campo de texto, el campo de texto debe enviar un evento, y si el usuario toca fuera del campo de texto, el UIButton enviará el evento.

+0

Como no puedo lograr que el evento toque el campo de texto, esto no funcionará. También me gustaría evitar crear vistas adicionales si es posible. – theK42

2

buena respuesta aquí: Change default touch events for UITextField

Utilice el delegado del campo de texto y hacer lo que quiere hacer en textFieldShouldBeginEditing:

Usted puede volver NO para evitar que el comportamiento por defecto.

+0

No es información inútil, podría ayudarme a acercarme al comportamiento que deseo. Sin embargo, no es una respuesta completa, ya que no puede ayudarme a detectar toques que comienzan dentro y terminan fuera del campo de la forma en que lo haría 'UIControlEventTouchUpOutside'. – theK42

+0

Por supuesto. ¡Debería haber leído tu pregunta correctamente! – beev

+0

Una palabra de advertencia aquí. Ese método se dispara en más casos que solo tocar, por ejemplo, al presionar la tecla tab en un teclado externo para recorrer campos de texto. Probado en iOS 9. –

0

Me he enfrentado a este problema hoy. Mi objetivo era cambiar el color de fondo del campo de texto al tocar hacia abajo y volverlo a activar al tocar/cancelar. Es extraño que el touchdown se envíe al objetivo desde UITextField, pero que toque hacia adentro, toque hacia afuera y que incluso toque cancelar no. Encontré la solución. Es simple. Simplemente cree una subclase de UITextField y anule los toquesEnded: y toques cancelados :.

@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 
1

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

Funciona bien para mí. Y es una 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 
Cuestiones relacionadas