2012-03-31 15 views
15

En mi aplicación, agrego dinámicamente imágenes a mi vista en tiempo de ejecución. Puedo tener varias imágenes en la pantalla al mismo tiempo. Cada imagen se carga desde un objeto. He agregado un tapGestureRecongnizer a la imagen para que se llame al método apropiado cuando lo toco.iOS - UITapGestureRecognizer - Selector con argumentos

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)]; 
    [plantImageView addGestureRecognizer:tapGesture]; 

Mi problema es que no sé qué imagen he tocado. Sé que puedo llamar a tapGestureRecognizer.location para obtener la ubicación en la pantalla, pero eso no es realmente bueno para mí. Idealmente, me gustaría poder pasar el objeto en el que se cargó la imagen al gesto de toque. Sin embargo, parece que solo puedo pasar el nombre del selector "imageTapped:" y no sus argumentos.

- (IBAction)imageTapped:(Plant *)plant 
{ 
    [self performSegueWithIdentifier:@"viewPlantDetail" sender:plant]; 
} 

¿Alguien sabe de una manera que me puede pasar a mi objeto como un argumento en el tapGestureRecongnizer o de cualquier otra manera que puedo conseguir una manija en ella?

Gracias

Brian

Respuesta

26

Ya casi ha terminado. UIGestureRecognizer tiene una propiedad de vista. Si asigna y adjuntar un reconocedor gesto para cada vista de la imagen - tal y como aparece lo hace en el fragmento de código - a continuación, el código gesto (el objetivo) puede tener este aspecto:

- (void) imageTapped:(UITapGestureRecognizer *)gr { 

    UIImageView *theTappedImageView = (UIImageView *)gr.view; 
} 

Lo que está menos claro a partir de la código que ya ha proporcionado es la forma de asociar su modelo de objetos de la planta con su correspondiente imageView, pero podría ser algo como esto:

NSArray *myPlants; 

for (i=0; i<myPlants.count; i++) { 
    Plant *myPlant = [myPlants objectAtIndex:i]; 
    UIImage *image = [UIImage imageNamed:myPlant.imageName]; // or however you get an image from a plant 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; // set frame, etc. 

    // important bit here... 
    imageView.tag = i + 32; 

    [self.view addSubview:imageView]; 
} 

Ahora el código GR pueden hacer esto:

- (void) imageTapped:(UITapGestureRecognizer *)gr { 

    UIImageView *theTappedImageView = (UIImageView *)gr.view; 
    NSInteger tag = theTappedImageView.tag; 
    Plant *myPlant = [myPlants objectAtIndex:tag-32]; 
} 
+0

Thats brillante. Un millón de gracias. ¡Funcionó perfectamente! Buena solución. –

Cuestiones relacionadas