2011-11-08 2 views
1

je l'ai fait la chose suivante:problème avec UITapGestureRecognizer un bouton

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

Mais je reçois SIGAGRT à cette ligne: int x = [sender tag]; disant:

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

MAINTENANT: Quel est le problème et quel est le

Répondre

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

Est-ce que résoudre le problème.

1

Un UITapGestureRecognizer n'a pas une propriété étiquette nommée - comme vous le voyez, l'envoyer er vous obtenez est PAS le bouton. Vous devez accéder au buttonPlayListView directement, comme

int x = [buttonPlayListView tag];

ou autrement rappelez quel bouton vous souhaitez accéder. Pourquoi insérez-vous un UITapGestureRecognizer dans un bouton?

+0

et comment je me souviens si je crée disons 100 boutons.Je me souviens en utilisant TAG.C'est pourquoi j'utilise tag ... pour se souvenir du bouton :) – adrian

+0

Vous pourriez sous-classe UIGestureRecognizer, en ajoutant la propriété myButton et définir lors de l'attribution du reconnaisseur de geste à un bouton. Vous pouvez ensuite convertir le UIGestureRecognizer que vous obtenez en tant qu'expéditeur en MyGestureRecognizer et obtenir la propriété myButton. Ou vous créez une variable de classe NSMutableDictionary et définissez le bouton en tant que valeur pour les reconnaisseurs de mouvements en tant que clé, par ex. [allMyGestureRecognizerButtons setObject: buttonPlaylistView forKey: doubleTap3] - alors vous obtenez le bouton en utilisant l'expéditeur comme clé dans le dictionnaire. – TheEye

+0

Vous pouvez également encore obtenir un seul robinet sur votre bouton (pas sûr, mais vous pouvez vérifier) ​​et rappelez-vous quel bouton a été tapé en dernier ... – TheEye

0

Pourquoi? Le bouton gère déjà que pour vous et vous envoyer un rappel, vous pouvez ajouter une cible à un bouton en utilisant cette méthode de UIControl

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

parce que quand je double cilck je veux faire quelque chose.Comprendre? Le bouton gère un simple clic – adrian

+0

Dans ce cas, vous ne devriez pas avoir un bouton du tout, juste une vue avec 2 reconnaisseurs de gestes un pour un robinet, un pour un robinet double. Comprendre. – jbat100

+0

Ensuite, il faut appuyer deux fois sur le bouton pour ne pas appuyer sur le bouton, le bouton ne le fera pas. – jbat100

1

Même si je suis sûr que vous allez dans ce sens, en ajoutant un double reconnaissance de gestes à un UIButton, vous pouvez toujours effectuer la tâche dont vous avez besoin et qui ne devrait pas l'être. beaucoup de travail pour vous. Vous avez fait le commentaire

et comment pourrais-je me souviens si je crée disons 100 boutons

à l'une des réponses, celle qui met en évidence ce que le problème est que ce qui cause votre SIGBART. UIGestureRecognizer n'a pas de propriété de balise. Voici ce que vous pouvez faire, parcourir tous les sous-aperçus de votre [vue personnelle] et trouver celui qui a le même UIGestureRecognizer, ce n'est pas la plus jolie solution, et plus vous aurez de sous-vues, plus la boucle sera longue prendre. Mais ça va faire ce que vous cherchez, donc si vous ajoutez.

Dans votre fonction handleDoubleTap que vous pourriez faire la

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

Cela devrait résoudre votre problème. Alternativement, si vous allez ajouter des boutons aux sous-vues des sous-vues, il serait préférable de garder une trace de vos UIButtons dans un NSMutableArray, vous le feriez en créant une propriété de classe (ou une variable membre) et en ajoutant les boutons en utilisant 'addObject:' fonction de NSMutableArray. Alors, au lieu de la ligne

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

ci-dessus vous pourriez échanger que pour

for(UIButton* pButton in m_pMutableButtonArray) 

où « m_pMutableButtonArray » est le nom de la variable que vous avez donné à votre NSMutableArray vous stockez les UIButtons. Cela signifie aussi que vous auriez supprimez le test suivant si isKindOfClass sur la ligne suivante.

Cela devrait résoudre votre problème.

+0

UIGestureRecognizer n'a pas de propriété de balise.Right, mais UIGestureRecognizer.view a la propriété de balise;). Le problème a été résolu dans @Till way.Thanks – adrian

Questions connexes