ios ¿Cómo hacer que UITextView detecte un toque?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"touchesBegan"); //test UITouch *touch = [event allTouches] anyObject]; if ([touch tapCount] == 2) { NSLog (@"tapcount 2"); [self.textview becomeFirstResponder]; } else if ([touch tapCount] == 1) { NSLog (@"tapcount 1"); [self.textview becomeFirstResponder]; [self.view performSelector:@selector(select:)]; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ [super touchesBegan:touches withEvent:event]; NSLog(@"touchesMoved"); } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"****touchesEnded"); [self.nextResponder touchesEnded: touches withEvent:event]; NSLog(@"****touchesEnded"); [super touchesEnded:touches withEvent:event]; NSLog(@"****touchesEnded"); } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ [super touchesCancelled:touches withEvent:event]; NSLog(@"touchesCancelled"); } 

MI PREGUNTA:

Quiero simular dos tomas al tocar una vez en una UITextView, que es la vista de text en este código. Pero no obtengo NSLog de uno y dos toques cuando presiono una o dos veces en la vista de text, solo fuera de él. ¿Qué debo hacer para que funcione?

Probablemente utilizaría dos reconocedores de gestos aquí.

 //...some stuff above here probably in you're controllers viewDidLoad UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)]; singleTap.numberOfTapsRequinetworking = 1; [someTextView addGestureRecognizer:singleTap]; [singleTap release]; UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapRecognized:)]; doubleTap.numberOfTapsRequinetworking = 2; [someTextView addGestureRecognizer:doubleTap]; [doubleTap release]; 

Y los selectores serían como:

 - (void)singleTapRecognized:(UIGestureRecognizer *)gestureRecognizer { NSLog(@"single tap"); // ...etc } - (void)doubleTapRecognized:(UIGestureRecognizer *)gestureRecognizer { NSLog(@"double tap"); // ...etc } 

Tuve el mismo problema y las otras respuestas no funcionaron para mí. Entonces esto es lo que hice.

Adjunté el gesto como otra sugerencia sugerida. Luego me aseguré de que se llamara al método delegado para la selección. Intenté simplemente seleccionar la celda pero eso no disparó el método de delegado. Creo que solo las interacciones del usuario hacen que se llame al método de delegado, por lo que este código imita ese comportamiento.

https://gist.github.com/brennanMKE/e89bf7a28d96812d6a22

 @implementation TappableTextView - (instancetype)init { self = [super init]; if (self) { [self setup]; } return self; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { [self setup]; } return self; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (void)setup { UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)]; singleTap.numberOfTapsRequinetworking = 1; [self addGestureRecognizer:singleTap]; } - (void)singleTapRecognized:(id)sender { UIView *superview = self.superview; UICollectionViewCell *cell = nil; NSIndexPath *indexPath = nil; while (superview) { if ([superview isKindOfClass:[UICollectionViewCell class]]) { cell = (UICollectionViewCell *)superview; } if ([superview isKindOfClass:[UICollectionView class]] && cell) { UICollectionView *collectionView = (UICollectionView *)superview; indexPath = [collectionView indexPathForCell:cell]; NSAssert(collectionView.delegate, @"Delegate must be defined"); NSAssert([collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)], @"Selection must be supported"); if (indexPath && [collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) { [collectionView.delegate collectionView:collectionView didSelectItemAtIndexPath:indexPath]; } return; } superview = superview.superview; } } @end 

Encontré un problema similar en el que quería capturar un toque en un textView sin editar el text subyacente.

Esta respuesta es para Swift 3.0.

Para mi solución, implementé el método textView delegate textViewShouldBeginEditing y devolví false para el valor. Esto me permite capturar toques en el textView sin ninguna sobrecarga adicional.

 extension ViewController: UITextViewDelegate { func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { // Do something return false } } 

Simplemente asegúrese de asignar textView para usar el delegado en su class ViewController.