iOS – UITapGestureRecognizer – Sélecteur avec des arguments

Dans mon application, j'ajoute dynamicment des images à ma vue lors de l'exécution. Je peux avoir plusieurs images sur l'écran en même time. Chaque image est chargée à partir d'un object. J'ai ajouté un tapGestureRecongnizer à l'image pour que la méthode appropriée soit appelée quand je la tape.

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

Mon problème est que je ne sais pas quelle image j'ai tapée. Je sais que je peux appeler tapGestureRecognizer.location pour get l'location à l'écran mais ce n'est pas vraiment bon pour moi. Idéalement, j'aimerais pouvoir passer l'object dont l'image a été chargée dans le geste du robinet. Cependant, il semble que je ne peux que passer le nom du sélecteur "imageTapped:" et non ses arguments.

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

Est-ce que quelqu'un sait d'une façon que je peux passer mon object comme un argument dans le tapGestureRecongnizer ou de toute autre manière que je peux get un traitement sur elle?

Merci

Brian

Tu y es presque. UIGestureRecognizer a une propriété d'affichage. Si vous allouez et associez un outil de reconnaissance de gestes à chaque vue d'image, comme vous le feriez dans l'extrait de code, votre code gestuel (sur la cible) peut ressembler à ceci:

 - (void) imageTapped:(UITapGestureRecognizer *)gr { UIImageView *theTappedImageView = (UIImageView *)gr.view; } 

Ce qui est less clair à partir du code que vous avez fourni, c'est comment vous associez votre object Model avec son imageView correspondante, mais cela pourrait être quelque chose comme ceci:

 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]; } 

Maintenant, le code gr peut le faire:

 - (void) imageTapped:(UITapGestureRecognizer *)gr { UIImageView *theTappedImageView = (UIImageView *)gr.view; NSInteger tag = theTappedImageView.tag; Plant *myPlant = [myPlants objectAtIndex:tag-32]; }