2012-04-24 19 views
7

Tengo un UIGestureRecognizer que deseo trabajar en dos UIView diferentes, ambas en la misma jerarquía de vistas de un UiViewController. La acción de UIGestureRecognizer es aproximadamente la misma en cada uno, por lo que me gustaría que se llame a la misma función (obviamente, lo hará) y en el momento de la ejecución le diré a qué UIViews me estoy refiriendo. ¿Pero cómo? No puedo ver que UIGestureRecognizer esté llevando la información del objeto con él. ¿Me falta la línea en la documentación o el gestureRecognizer no sabe a qué objeto se ha adjuntado para que se llame? Parece que el objetivo del lenguaje sería que lo sabría.¿UIGestureRecognizer sabe a qué objeto se llama?

Como alternativa, tal vez estoy mal entendido la intención de la clase y que no debería hacerlo:

UITapGestureRecognizer *dblTap = 
[[UITapGestureRecognizer alloc] initWithTarget: self 
             action: @selector(handleDblTap:)]; 
[viewA addGestureRecognizer: dblTap]; 
[viewB addGestureRecognizer: dblTap]; 

y luego esperar a ser capaz de:

-(void)handleDblTap: (UIGestureRecognizer *)gestureRecognizer 
{ 
    if (viewA)... 

Si, de hecho, UIGestureRecognizer no soporta estar unido a múltiples objetos simultáneamente, entonces, si sabes por qué no lo soporta, ¿podrías educarme? Gracias por la ayuda.

+1

@NJones es correcto. Una vista por reconocedor. También puede establecer una etiqueta para cada reconocedor para descubrir qué reconocedor llamó a ese método. –

Respuesta

21

El estándar es una vista por reconocedor. Pero aún puedes usar eficientemente un método de manejo.

Se podría crear instancias de los reconocedores de este modo:

UITapGestureRecognizer *dblTapViewA = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDblTap:)]; 
[viewA addGestureRecognizer: dblTapViewA]; 

UITapGestureRecognizer *dblTapViewB = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDblTap:)]; 
[viewB addGestureRecognizer: dblTapViewB]; 

A continuación, el método de control podría ser algo como:

-(void)handleDblTap:(UITapGestureRecognizer *)tapRec{ 
    if (tapRec.view == viewA){ 
     // double tap view a 
    } else if (tapRec.view == viewB) { 
     // double tap view b 
    } 
} 
+0

Eso fue bien explicado para mí. Gracias. – StoneBreaker

-1
UITapGestureRecognizer *dblTapA = 
[[UITapGestureRecognizer alloc] initWithTarget: self 
            action: @selector(handleDblTap:)]; 
[viewA addGestureRecognizer: dblTapA]; 

UITapGestureRecognizer *dblTapB = 
[[UITapGestureRecognizer alloc] initWithTarget: self 
            action: @selector(handleDblTap:)]; 
[viewA addGestureRecognizer: dblTapB]; 
0

Puede asignar una etiqueta para ver y luego simplemente comparar esa marque y realice una acción.

UITapGestureRecognizer *dblTap = 
[[UITapGestureRecognizer alloc] initWithTarget: self 
            action: @selector(handleDblTap:)]; 
[view addGestureRecognizer: dblTap]; 
view.tag = 2000; // set any integer 

Y mientras llama

-(void)handleDblTap:(UITapGestureRecognizer *)tapRec{ 
    if (tapRec.view.tag == 2000){ 
     // double tap view with tag 
    } 
} 
Cuestiones relacionadas