2011-05-21 1820 views
45

Tengo una serie de imágenes que identifico con su etiqueta. He agregado un solo gesto de toque a las imágenes.Selector de UITapGestureRecognizer, el remitente es el gesto, no el objeto ui

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectImage:)]; 
[tableGridImage addGestureRecognizer:singleTap]; 
tableGridImage.userInteractionEnabled = YES; 
[singleTap release]; 

Esto logra llamar al seleccionador de Seleccionar imagen, pero pasa el gesto como el remitente. Necesito la vista de imagen como remitente para poder obtener la etiqueta.

¿Alguna idea sobre cómo puedo obtener la imagen vista y su etiqueta?

Respuesta

51

Descubrí cómo obtener la etiqueta, que fue la parte más importante de la pregunta para mí. Dado que el gesto es el remitente, me di cuenta de la vista del que está unido al que se envía junto con él:

[(UIGestureRecognizer *)sender view].tag 

Todavía estoy ansioso por ver si alguien me puede decir cómo enviar un argumento a través de un selector de UITapGestureRecognizer.

+1

Sigo teniendo curiosidad si alguien me puede decir cómo enviar un argumento a través de un selector UITapGestureRecognizer. Yo también. –

+1

Adam Estoy bastante seguro de que esa es la única forma de hacerlo, a través de la etiqueta en el UIImageView. Ya sabes, hay algunos aspectos positivos en el uso de la etiqueta en la imagen en sí: imagine si, por ejemplo, tenía más de un reconocedor de gestos, o si estaba recibiendo esa información sobre la imagen de alguna otra manera. Está bien que esté en la imagen, en lugar de en G.R. ¡Es un gran consejo gracias por la gran pregunta/respuesta! – Fattie

+0

¡Gracias! ¡Esto también me ayudó! –

24

El único argumento que puede enviar a través del selector UITapGestureRecognizer es la misma UITapGestureRecognizer de la siguiente manera:

Asegúrese de poner ":" después del nombre del selector, como lo hizo anteriormente:

UITapGestureRecognizer *singleTap = 
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectImage:)]; 

Entonces agregue un parámetro a selectImage para que pueda recuperar la vista de la siguiente manera:

-(void) selectImage:(UITapGestureRecognizer *)gestureRecognizer{ 

    //Get the View 
    UIImageView *tableGridImage = (UIImageView*)gestureRecognizer.view; 
} 
+2

¡Gracias por tu explicación, Samidjo! Como nota adicional, he encontrado que es útil agregar mi propia propiedad en la vista - '@property (weak, nonatomic) id relatedObject'. ¡De esta manera, puede pasar efectivamente lo que quiera al asignarlo a la propiedad de la vista! :RE –

2

Si necesita una funcionalidad distinta para el manejador, puede ver el proyecto BlocksKit y el archivo this en particular. El proyecto es un proyecto CocoaPods para que pueda instalarlo fácilmente en su cadena de herramientas.

Un ejemplo del archivo de código primera referencia:

UITapGestureRecognizer *singleTap = [UITapGestureRecognizer recognizerWithHandler:^(id sender) { 
    NSLog(@"Single tap."); 
} delay:0.18]; 
[self addGestureRecognizer:singleTap]; 

Esto podría efectivamente le permitirá configurar un reconocedor gesto fácilmente para cada imagen.

3

De @ dysan819 respuesta, logro obtener objeto sin etiqueta. En mi caso es UILabel.

- (void)labelTap:(id)sender { 
    NSLog(@"tap class: %@", [[(UIGestureRecognizer *)sender view] class]); 
    if ([[(UIGestureRecognizer *)sender view] isKindOfClass:[UILabel class]]) { 
     UILabel *lb = (UILabel*)[(UIGestureRecognizer *)sender view]; 
     NSLog(@"tap: %@", lb.text); 
    } 
} 
Cuestiones relacionadas