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