adrian
adrian

Reputation: 4594

issue with UITapGestureRecognizer for a button

I've done the following thing:

 buttonPlaylistView = [[UIButton alloc] initWithFrame:CGRectMake(self.view.frame.size.width *(urlList.count+1), 0, self.view.frame.size.width, self.view.frame.size.height)];
            buttonPlaylistView.tag = 0;

 UITapGestureRecognizer *doubleTap3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
            [doubleTap3 setNumberOfTapsRequired:2];
            [buttonPlaylistView addGestureRecognizer:doubleTap3];
            [doubleTap3 release];

-(void) handleDoubleTap:(UITapGestureRecognizer *)sender{
    if(sender.state == UIGestureRecognizerStateEnded)

    int x = [sender tag];
    return;
}

But I get SIGAGRT at this line: int x = [sender tag]; saying:

[UITapGestureRecognizer tag]: unrecognized selector sent to instance 0x61280b0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITapGestureRecognizer tag]: unrecognized selector sent to instance 0x61280b0'

NOW:What's the problem and what's the solution for this?Thanks

Upvotes: 1

Views: 4553

Answers (4)

Jamie Stewart
Jamie Stewart

Reputation: 331

Even though I'm quite sure that you're going about this the wrong way, adding a double tap gesture recognizer to a UIButton, there is a way you can still perform the task you require that shouldn't be too much work for you. You've made the comment

and how could I remember if I create let say 100 buttons

to one of the answers, the one which highlights what the issue is that's causing your SIGBART. UIGestureRecognizer does not have a tag property.

Here's what you could do, is to iterate through all the subviews of your [self view] and find the one that has the same UIGestureRecognizer, it's not the prettiest solution, and the more subview's you have the longer the loop will take. But it'll do what you seem to be looking for, so if you're adding .

In your handleDoubleTap function you could do the following

-(void) handleDoubleTap:(UITapGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateEnded)
    {
        int iButtonTag = -1 //This is important later to escape the below for loop as we don't need to needlessly go around in circles
        for(UIView* psubView in [[self view] subviews])
        {
            if( [psubView isKindOfClass:[UIButton class]] )
            {
                UIButton* pButton = (UIButton*)psubView;
                for(UIGestureRecognizer* pGesture in [pButton gestureRecognizers] )
                {
                     if( pGesture == sender )//this is the button we're after
                     {
                         iButtonTag = [pButton tag];
                         break;
                     }
                }
                if( iButton != -1 )//found what we came for
                {
                    break;
                }
             }
        }
        //do what ever it was you needed to do now that you have the views tag, or you could have kept a reference to the button etc.
    }
 }

That should solve your problem. Alternatively if you're going to be adding buttons to subviews of subviews it would be better to keep track of your UIButtons in an NSMutableArray , you would do this by creating a class property (or member variable) and adding the buttons to this using the 'addObject:' function of NSMutableArray. Then instead of the line

for(UIView* psubView in [[self view] subviews])

above you could exchange that for

for( UIButton* pButton in m_pMutableButtonArray )

where "m_pMutableButtonArray" is the variable name you gave to your NSMutableArray you were storing the UIButtons in. This also means you would do away with the following if isKindOfClass test on the following line.

That should fix your problem.

Upvotes: 1

Till
Till

Reputation: 27597

-(void) handleDoubleTap:(UITapGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateEnded)
    {
      int x = [sender.view tag];
    }
}

Will fix the issue.

Upvotes: 12

jbat100
jbat100

Reputation: 16827

Why are you putting a UITapGestureRecognizer in a button? The button already handles that for you and will send you a callback, you can add a target to a button using this UIControl method

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

Upvotes: 0

TheEye
TheEye

Reputation: 9346

An UITapGestureRecognizer does not have a property named tag - as you see, the sender you get is NOT the button. You have to access the buttonPlayListView directly, like

int x = [buttonPlayListView tag];

or otherwise remember which button you want to access.

Upvotes: 1

Related Questions