UIGestura falla por una razón desconocida en IOS

Tengo un UITextField que es la subvista de UIScrollView. Tengo un toque simple (o tal vez el toque anterior) como parte de UITextField que lo convierte en el primer respondedor. Quería agregar un Gesto de doble toque al UITextField. Para hacer que los dos Gestos se excluyan mutuamente, tuve que sobrecargar (aunque no es la palabra correcta porque no estoy usando el mismo nombre), el toque único Gesto. Cuando lo hago funciona bien mientras la function que llama no convierte a UITextField en el primer respondedor. Si hace el campo de text el primer respondedor, falla la segunda vez que se llama … wtf. Por lo tanto, un poco de ayuda sería muy importante.

aquí es donde agrego el gesto

UITapGestureRecognizer * singleTextTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTextTap:)]; singleTextTap.numberOfTapsRequinetworking = 1; [aTextField addGestureRecognizer:singleTextTap]; 

y aquí es donde se llama

 //single tap text - (void) handleSingleTextTap:(UITapGestureRecognizer *)gestureRecognizer{ NSLog(@"handling single tap"); NSLog(@"textField gestures %@", [gestureRecognizer.view.gestureRecognizers descriptionWithLocale:nil]); [(UITextField *)gestureRecognizer.view becomeFirstResponder]; } 

puede notar que el NSLog que coloca a los gestores registrados en el campo de text fue para verificar el estado de mi gesto de un solo text. que es 'finalizado' la primera vez y todas las próximas veces este código nunca se alcanza

El comportamiento que está viendo se debe a que cada vez que envía un post becomeFirstResponder a un UITextField , establece sus propios reconocedores de gestos. Si haces un logging en [textField gestureRecognizers] verás que configura muchos de ellos. Estos son para hacer frente a las funciones de edición de text, como pulsación larga para el movimiento del cursor y tal. A modo de agregado, cancela los que ha configurado. La forma más fácil de lidiar con esto es algo como esto.

 - (void) singleTap:(UITapGestureRecognizer*)singleTap { if (![self.textField isFirstResponder]) { [self.textField becomeFirstResponder]; self.label.text = @"Single Tap -> Make First Responder"; [self.label setNeedsDisplay]; } } - (void) doubleTap:(UITapGestureRecognizer*)doubleTap { if (![self.textField isFirstResponder]) { [self.textField becomeFirstResponder]; self.label.text = @"Double Tap -> Make First Responder"; [self.label setNeedsDisplay]; } } - (void) setupTextGestureRecognizers { for (UIGestureRecognizer *rec in self.textField.gestureRecognizers) { [self.textField removeGestureRecognizer:rec]; } UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)] autorelease]; UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)] autorelease]; [singleTap setNumberOfTapsRequinetworking:1]; [doubleTap setNumberOfTapsRequinetworking:2]; [singleTap setCancelsTouchesInView:YES]; [doubleTap setCancelsTouchesInView:YES]; [singleTap requireGestureRecognizerToFail:doubleTap]; [self.textField addGestureRecognizer:singleTap]; [self.textField addGestureRecognizer:doubleTap]; } - (void)viewDidLoad { [super viewDidLoad]; [self setupTextGestureRecognizers]; self.textField.delegate = self; } - (BOOL) textFieldShouldReturn:(UITextField *)tf { [tf resignFirstResponder]; if (tf == self.textField) { [self setupTextGestureRecognizers]; } return YES; } 

Aquí hay un proyecto de ejemplo que muestra este código en uso.

Lo que estás haciendo parece realmente extraño, pero sea lo que sea. Supongo que sabes lo que estás haciendo.

Puede probar lo siguiente:

 UITapGestureRecognizer *doubleTap = ...; UITapGestureRecognizer *singleTap = ...; [singleTap requireGestureRecognizerToFail:doubleTap]; 

Esto significa que el reconocedor de un solo toque solo se disparará si el toque doble no se dispara, haciéndolos mutuamente excluyentes.