Événement de clic de bouton de déclenchement par programme?

126

Existe-t-il un moyen de déclencher par programme un événement de clic sur un bouton? J'ai un bouton placé là dans un UIView, et dans un scénario particulier, je veux cliquer sur le bouton via le code, pas manuellement en tant qu'utilisateur. Est-ce possible dans le développement iOS? Veuillez fournir vos suggestions et me guider sur la manière de procéder.

Merci.

Getsy
la source

Réponses:

314

Un peu comme la réponse de Ken, mais plus flexible car il gardera une trace des actions réelles des boutons si vous les modifiez ou en ajoutez plusieurs.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];
Zaky allemand
la source
8
Cela met-il en surbrillance le bouton button.showsTouchWhenHighlighted = YEScomme il le ferait avec une touche réelle?
chown
2
Cette réponse est excellente car elle peut facilement être traduite en d'autres contrôles tels que UISwitch (UIControlEventValueChanged) et dans mon cas, c'est bien mieux que d'appeler directement le code cible / action b / c je veux que le commutateur bascule! THX.
John Erck
Non, il ne met pas en surbrillance le bouton si button.showsTouchWhenHighlighted = YES. ; (
Richie Hyatt
7
si vous avez besoin du surlignage, vous pouvez le faire. [jeu de boutons en surbrillance: OUI]; [bouton sendActionsForControlEvents: UIControlEventTouchUpInside]; [jeu de boutons en surbrillance: NON]; et cela fonctionne très bien. -rrh
Richie Hyatt
Bonjour @zaky, si je ne veux que de l'animation, sans action d'envoi, comment puis-je le faire?
benhi
13

J'ai eu le même problème que ci-dessus. J'aurais posté un commentaire, mais ma réputation n'est pas assez élevée. Donc, je publierai plutôt la réponse complète:

[btn setHighlighted:YES];
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
[btn performSelector:@selector(setHighlighted:) withObject:NO afterDelay:0.25];

Cela appuiera sur le bouton par programme et le mettra en surbrillance pendant une durée apparemment normale. La suggestion de Richie n'a pas fonctionné car le bouton n'a été mis en surbrillance (voire pas du tout) pendant un temps imperceptible.

Chad Hine
la source
Il n'a pas été mis en surbrillance, le dessin n'a lieu qu'après l'exécution du morceau de code actuel. C'est une bonne solution.
mattsven
6

Pourquoi ne pas simplement exécuter le code qui s'exécute lorsque l'utilisateur appuie sur le bouton?

-(void)myMethod
{
   // do stuff
}

-(IBAction)myButtonClick:(id)sender
{
    [self myMethod];
}

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}
Evan Mulawski
la source
Non, mon exigence n'est pas d'appeler la méthode, comment déclencher un événement de clic de bouton par programme, pas lorsque l'utilisateur clique dessus manuellement. J'ai créé un UIButton par programmation dans un UIView, je veux déclencher automatiquement un événement de clic de bouton après un certain intervalle de temps via le programme lui-même, pas par l'utilisateur.
Getsy
Ensuite, ce n'est pas possible sans synthétiser le toucher. Voir cocoawithlove.com/2008/10/… . Cependant, vous ne pouvez pas soumettre votre application à l'App Store à l'aide de cette méthode, car elle utilise une API privée. Il est normalement utilisé à des fins de débogage.
Evan Mulawski
Vous n'expliquez pas pourquoi vous devez simuler un toucher plutôt que d'appeler simplement la méthode, mais c'est de loin le moyen le plus simple. L'action de votre minuterie peut appeler la méthode de votre choix et la méthode qu'elle appelle peut indiquer dans l'interface utilisateur que le bouton est enfoncé en modifiant l'état du bouton (sélectionné, mis en surbrillance, etc.). Si cela ne fonctionne pas, qu'il en soit ainsi.
XJones
1

Si vous parlez d'un UIButton, vous pouvez simplement appeler la même méthode que l'UIButton appelle quand il est tapé. Par exemple:

[self myButtonsTargetMethod];
Ken Pespisa
la source
Non, mon exigence n'est pas d'appeler la méthode, comment déclencher un événement de clic de bouton par programme, pas lorsque l'utilisateur clique dessus manuellement. J'ai créé un UIButton par programmation dans un UIView, je veux déclencher automatiquement un événement de clic de bouton après un certain intervalle de temps via le programme lui-même, pas par l'utilisateur.
Getsy le
1

Oui,

[_button setHighlighted:YES];
[_button sendActionsForControlEvents:UIControlEventTouchUpInside];
[_button setHighlighted:NO];

Mais le problème ici est que vous ne pourrez pas voir ces événements parce que c'est trop rapide. donc ce que vous pouvez faire est d'essayer le code ci-dessus avec NSTimer.

NSTimer *quick = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(MeFirst:) userInfo:nil repeats:NO];

MeFirst est la méthode que j'ai créée.

Bharat jain
la source