76 votes

UIBarButtonItem: cible-action ne fonctionne pas?

J'ai un affichage personnalisé à l'intérieur d'un UIBarButtonItem, mis en appelant -initWithCustomView. Mon bouton de la barre d'élément rend bien, mais quand je la frappe, il n'a pas d'invoquer l'action sur mon objet cible.

Voici mon code:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage.png"]];
UIBarButtonItem *bbItem = [[UIBarButtonItem alloc] initWithCustomView:imageView];
self.navigationItem.leftBarButtonItem = bbItem;
[imageView release];
[bbItem setTarget:self];
[bbItem setAction:@selector(deselectAll)];

120voto

drawnonward Points 35444

Je ne pense pas que la cible et de l'action de la UIBarButtonItem s'applique à des vues personnalisées. Essayez d'utiliser un UIButton au lieu de UIImageView et de l'application de la cible et de l'action sur le bouton.

23voto

Gros Points 467

Voici comment je fais il a travaillé :

UIButton* infoButton = [UIButton buttonWithType: UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(displayAboutUs) forControlEvents:UIControlEventTouchDown];

UIBarButtonItem* itemAboutUs =[[UIBarButtonItem alloc]initWithCustomView:infoButton];
…

23voto

Tim Arnold Points 2653

J'ai eu le même problème, mais était opposé à l'aide d'un UIButton au lieu d'un affichage personnalisé pour mon UIBarButtonItem (par drawnonward de réponse).

Alternativement, vous pouvez ajouter un UIGestureRecognizer à la vue personnalisée avant de l'utiliser pour initialiser UIBarButtonItem; ce qui semble fonctionner dans mon projet.

C'est comment je pourrais modifier votre code d'origine:

UIImageView *SOCImageView = [[UIImageView alloc] initWithImage:
                             [UIImage imageNamed:@"cancel_wide.png"]];

UITapGestureRecognizer *tapGesture = 
       [[UITapGestureRecognizer alloc] initWithTarget:self 
                                               action:@selector(deselectAll:)];
[SOCImageView addGestureRecognizer:tapGesture];

SOItem.leftBarButtonItem = 
       [[[UIBarButtonItem alloc] initWithCustomView:SOCImageView] autorelease];
[tapGesture release];
[SOCImageView release];

9voto

Zac Witte Points 50

Voici comment j'ai mis en place le UIButton à l'intérieur de la UIBarButtonItem:

UIButton *logoButton = [UIButton buttonWithType:UIButtonTypeCustom];
[logoButton setImage: [UIImage imageNamed:@"icon.png"] forState:UIControlStateNormal];
logoButton.frame = CGRectMake(0, 0, 30, 30);
[logoButton addTarget:self action:@selector(showAbout:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:logoButton];
self.navigationItem.rightBarButtonItem = barItem;
[barItem release];

7voto

James Elliott Points 136

J'ai eu un problème similaire. Et j'ai d'abord suivi le chemin proposé par @drawnonward, mais a couru dans des problèmes lorsque j'ai essayé de mon action présente une liste de contrôleur sur un iPad: à l'Aide d'un intégré à UIButton comme un affichage personnalisé signifie que le UIButton est l'expéditeur de l'événement, et la liste du contrôleur de presentPopoverFromBarButtonItem: méthode se bloque lorsqu'il tente d'envoyer des messages qui ne sont appropriées que pour les réels UIBarButtonItems.

La solution que j'ai finalement trouvé était de voler l'image que je voulais utiliser ("info" icône) à partir d'un jetable UIButton, et de construire mon UIBarButtonItem comme suit:

// Make the info button use the standard icon and hook it up to work
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
UIBarButtonItem *barButton = [[[UIBarButtonItem alloc]        
      initWithImage:infoButton.currentImage
              style:UIBarButtonItemStyleBordered
             target:self
             action:@selector(showInfo:)] autorelease];

L'utilisation de ce initialiseur de rendements d'un bouton de la barre dont la cible et le sélecteur fonctionnent réellement. Il est également plus facile que d'habillage de l'image dans la vue personnalisée, mais c'est juste la cerise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X