dysan819
dysan819

Reputation: 1031

UITapGestureRecognizer selector, sender is the gesture, not the ui object

I have a series of imageviews that I identify using their tag. I have added a single tap gesture to the images.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectImage:)];
[tableGridImage addGestureRecognizer:singleTap];
tableGridImage.userInteractionEnabled = YES;
[singleTap release];

This manages to call the selectImage selector ok, but passes the gesture as the sender. I need the imageview as the sender so I can get the tag.

Any ideas on how I can get the imageview and it's tag?

Upvotes: 49

Views: 33550

Answers (4)

Dody Rachmat Wicaksono
Dody Rachmat Wicaksono

Reputation: 1016

From @dysan819 answer, I manage to get object without tag. In my case is UILabel.

- (void)labelTap:(id)sender {
    NSLog(@"tap class: %@", [[(UIGestureRecognizer *)sender view] class]);
    if ([[(UIGestureRecognizer *)sender view] isKindOfClass:[UILabel class]]) {
        UILabel *lb = (UILabel*)[(UIGestureRecognizer *)sender view];
        NSLog(@"tap: %@", lb.text);
    }
}

Upvotes: 4

Norman H
Norman H

Reputation: 2262

If you need distinct functionality for the handler you might check out the BlocksKit project and this file in particular. The project is a CocoaPods project so you can install it easily into your toolchain.

An example from the first referenced code file:

UITapGestureRecognizer *singleTap = [UITapGestureRecognizer recognizerWithHandler:^(id sender) {
     NSLog(@"Single tap.");
 } delay:0.18];
 [self addGestureRecognizer:singleTap];

This could effectively allow you to setup a gesture recognizer easily for each image.

Upvotes: 2

Samidjo
Samidjo

Reputation: 2355

The only argument you can send through UITapGestureRecognizer selector is the UITapGestureRecognizer itself as following:

Make sure to put ":" after the selector name like you previously did :

UITapGestureRecognizer *singleTap = 
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectImage:)];

Then add a parameter to selectImage so you can retrieve the View as following:

-(void) selectImage:(UITapGestureRecognizer *)gestureRecognizer{

    //Get the View
    UIImageView *tableGridImage = (UIImageView*)gestureRecognizer.view;
}

Upvotes: 28

dysan819
dysan819

Reputation: 1031

I figured out how to get the tag, which was the most important part of the question for me. Since the gesture is the sender, I figured out the the view it is attached to is sent along with it:

[(UIGestureRecognizer *)sender view].tag

I am still curious if anyone can tell me how to send an argument through a UITapGestureRecognizer selector.

Upvotes: 54

Related Questions