2012-03-31 7 views
15

In meiner App füge ich dynamisch Bilder zu meiner Ansicht zur Laufzeit hinzu. Ich kann mehrere Bilder gleichzeitig auf dem Bildschirm haben. Jedes Bild wird von einem Objekt geladen. Ich habe dem Bild einen tapGestureRecongnizer hinzugefügt, sodass beim Tippen auf die entsprechende Methode aufgerufen wird.iOS - UITapGestureRecognizer - Selektor mit Argumenten

Mein Problem ist, dass ich nicht weiß, welches Bild ich angezapft habe. Ich weiß, dass ich tapGestureRecognizer.location anrufen kann, um den Standort auf dem Bildschirm zu bekommen, aber das ist nicht wirklich gut für mich. Idealerweise möchte ich das Objekt, aus dem das Bild geladen wurde, in die Tippgeste übergeben. Es scheint jedoch, dass ich nur den Selektornamen "imageTapped:" und nicht seine Argumente übergeben kann.

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

Kennt jemand eine Möglichkeit, dass ich meine Aufgabe als Argument in die tapGestureRecongnizer oder jede andere Art und Weise passieren kann ich einen Griff auf es zu bekommen?

Dank

Brian

Antwort

26

Sie sind fast da. UIGestureRecognizer hat eine View-Eigenschaft. Wenn Sie eine Gestenerkenner jede Bildansicht zuweisen und befestigen - so wie es scheint, dass Sie in dem Code-Schnipsel zu tun - dann Geste Code (auf dem Ziel) kann wie folgt aussehen:

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

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

Was aus dem weniger klar ist, Code, den Sie zur Verfügung gestellt ist, wie Sie Ihr Anlagenmodellobjekt assoziieren mit ihm entsprechenden Imageview ist, aber es könnte so etwas wie dieses:

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

Nun ist die gr Code kann dies tun:

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

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

das ist brillant. Tausend Dank. Es hat perfekt funktioniert! Nette Lösung. –