web-dev-qa-db-fra.com

Pourquoi mon événement de "retouche à l'intérieur" pour mon UIButton n'est-il pas appelé?

J'ai fabriqué beaucoup de boutons et je ne comprends pas pourquoi celui-ci ne fonctionnera pas. 

Ma hiérarchie est configurée comme ceci:

View -> Scroll View -> Subview -> Button

Il y a beaucoup d'autres éléments dans cette sous-vue et chacun d'eux fonctionne lorsqu'il est touché. Dans le générateur d'interface, je peux voir que l'événement "Touch Up Inside" est lié à ma méthode. 

"- (IBAction)favoritesButtonDepressed:(id)sender"

Cependant, lorsque je clique sur le bouton, cette méthode ne s'exécute jamais et mon point d'arrêt n'est par la suite jamais touché.

J'ai remarqué que même lorsque j'appuyais sur le bouton, le libellé ne changeait pas de couleur (même si l'affichage est en surbrillance est activé), mais mon autre bouton de la vue le fait. 

L'interaction utilisateur est activée sur le bouton ainsi que sur tout ce qui se trouve dans la hiérarchie.

Afin que mes éléments dans la sous-vue puissent recevoir des événements tactiles, j'ai fait en sorte que la vue défilement ressemble à la 4ème réponse de cet article .

32
Architekt

Aha, je l'ai. Il s'avère que la sous-vue contenant le bouton (ainsi que les autres contrôles) avait une hauteur de 740 et que le bouton avait un Y de 781. Déplacer le bouton vers le haut corrigeait le problème. Puisque tout s’affichait correctement, je n’ai pas pensé à vérifier la hauteur de la sous-vue.

48
Architekt

Je pense que vous avez placé votre bouton sur UIImageView. Si tel est le cas, vous devez permettre à UserInteraction de l'activer pour ce UIImageView. Vérifiez s'il vous plaît.

15
Ashutosh

Si une UITapGestureRecognizer est implémentée sur l’un des super View de votre bouton. alors UIButtonEventTouchUpInside ne sera pas renvoyé.

vous devriez implémenter UITapGestureRecognizer comme ceci 

tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
[tapGesture setCancelsTouchesInView:NO]; // This should do what you want
[tapGesture setDelegate:self];
11
Xeieshan

Assurez-vous que votre bouton est placé dans les limites de superView ,
Si un bouton est placé en dehors des limites de superView, le bouton ne peut pas être cliqué,
à cause de l'implémentation de la fonction hitTest

11
Shawn Wang

Avoir une mise en page ressemble à:

Vue -> Sous-vue (UIView) -> Bouton

Pour résoudre ce problème, cochez la case "Interaction utilisateur activée" dans les attributs de Subview (UIView).

4
Nianliang

Une autre chose à considérer est de savoir si vous avez placé une autre vue dessus.

Par exemple, si vous chargez une autre vue à partir d'une pointe et que vous l'encadrez de manière incorrecte, il est fort possible qu'elle apparaisse au-dessus du bouton, interceptant ainsi toute pression.

Vous pouvez vérifier qu'il s'agit bien de XCode 6 avec le contrôle "Debug View Heirachy".

3
Thomas Clowes

J'ai eu quelque chose de similaire récemment;

Essayez de supprimer la déclaration (IBAction)favoritesButtonDepressed:(id)sender (et la méthode) dans votre contrôleur et de la "faire glisser" à nouveau depuis Interface Builder.

1
MDB983
1
LML

Dans mon cas, IBAction pour le bouton ne fonctionnait pas, j'ai essayé de nombreuses façons. J'ai donc créé un IBOutlet pour le bouton et ajouté une action de clic en utilisant la méthode "addTarget".

[myButton addTarget:self action:@selector(dismissClickFunction:) forControlEvents:UIControlEventAllEvents];
1
Smart guy

J'ai eu le même problème.

J'ai eu un bouton dans un xib que j'ai placé à l'intérieur d'une vue.

J'ai laissé l'instance de xib à sa petite taille par défaut définie lors de l'importation, car je la redimensionne automatiquement dans le code pour gérer la rotation des périphériques.

Cela a empêché le bouton de réagir au toucher, même s'il était clairement au milieu de l'écran.

Je l'ai corrigé en changeant simplement la disposition de l'instance xib pour remplir la vue parente.

0
Pic Mickael

Dépannage:  

  • Assurez-vous qu'il n'y a pas de vue cachée devant votre bouton. 
  • Assurez-vous que l'interaction utilisateur est définie sur true.
0
ScottyBlades