проблема с UITapGestureRecognizer для кнопки - PullRequest
1 голос
/ 08 ноября 2011

Я сделал следующее:

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

Но я получаю SIGAGRT в этой строке: int x = [sender tag]; говоря:

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

СЕЙЧАС: в чем проблема икакое решение для этого? Спасибо

Ответы [ 4 ]

12 голосов
/ 08 ноября 2011
-(void) handleDoubleTap:(UITapGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateEnded)
    {
      int x = [sender.view tag];
    }
}

Исправит проблему.

1 голос
/ 08 ноября 2011

Несмотря на то, что я совершенно уверен, что вы поступите неправильно, добавив в UIButton распознаватель жестов двойным касанием, вы все равно сможете выполнить требуемую задачу, которая не должна быть слишком большой. работать для вас. Вы сделали комментарий

и как я могу вспомнить, если я создаю, скажем, 100 кнопок

на один из ответов, который подчеркивает, в чем заключается проблема, вызывающая ваш SIGBART. UIGestureRecognizer не имеет свойства тега.

Вот что вы могли бы сделать, это перебрать все подпредставления вашего [собственного представления] и найти тот, который имеет тот же UIGestureRecognizer, это не самое симпатичное решение, и чем больше подпредставлений у вас, тем дольше будет выполняться цикл , Но это будет делать то, что вы, похоже, ищете, так что если вы добавляете.

В вашей функции handleDoubleTap вы можете сделать следующее

-(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.
    }
 }

Это должно решить вашу проблему. В качестве альтернативы, если вы собираетесь добавлять кнопки в подпредставления подпредставлений, было бы лучше отслеживать ваши UIButton-ы в NSMutableArray, вы бы сделали это, создав свойство класса (или переменную-член) и добавив к нему кнопки, используя 'addObject:' функция NSMutableArray. Тогда вместо строки

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

выше, вы можете обменять это на

for( UIButton* pButton in m_pMutableButtonArray )

где "m_pMutableButtonArray" - это имя переменной, которую вы дали своему NSMutableArray, в котором вы хранили UIButtons. Это также означает, что вы бы покончили со следующим тестом isKindOfClass в следующей строке.

Это должно решить вашу проблему.

1 голос
/ 08 ноября 2011

У UITapGestureRecognizer нет свойства с именем tag - как видите, отправитель, которого вы получите, - НЕ кнопка. Вы должны получить доступ к buttonPlayListView напрямую, например

int x = [buttonPlayListView tag];

или иначе запомните, к какой кнопке вы хотите получить доступ.

0 голосов
/ 08 ноября 2011

Почему вы помещаете UITapGestureRecognizer в кнопку?Кнопка уже обрабатывает это для вас и отправит вам обратный вызов, вы можете добавить цель для кнопки, используя этот метод UIControl

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