2012-03-31 7 views
15

Nella mia app aggiungo dinamicamente immagini alla mia visualizzazione in fase di esecuzione. Posso avere più immagini sullo schermo allo stesso tempo. Ogni immagine è caricata da un oggetto. Ho aggiunto un tapGestureRecongnizer all'immagine in modo che venga chiamato il metodo appropriato quando lo tocco.iOS - UITapGestureRecognizer - Selettore con argomenti

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

Il mio problema è che non so quale immagine ho toccato. So che posso chiamare tapGestureRecognizer.location per ottenere la posizione sullo schermo, ma questo non mi fa molto bene. Idealmente, mi piacerebbe essere in grado di passare l'oggetto dal quale è stata caricata l'immagine nel gesto di tocco. Tuttavia, sembra che io sia in grado di passare solo il nome del selettore "imageTapped:" e non i suoi argomenti.

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

Qualcuno sa di un senso che posso passare il mio oggetto come argomento nella tapGestureRecongnizer o in qualsiasi altro modo per ottenere una maniglia su di esso?

Grazie

Brian

risposta

26

Ci siamo quasi. UIGestureRecognizer ha una proprietà view. Se si alloca e allegare un sistema di riconoscimento gesto per ogni immagine visualizzata - proprio come appare si fa nel frammento di codice - allora il vostro codice gesto (sul target) può apparire come segue:

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

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

Qual è meno chiaro dalla il codice che hai fornito è come si associa l'oggetto modello di impianto con il suo corrispondente IMAGEVIEW, ma potrebbe essere qualcosa di simile:

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

Ora il codice gr può fare questo:

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

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

Thats brillante. Grazie mille. Ha funzionato perfettamente! Bella soluzione –