¿Programar evento de clic del botón de disparo?

126

¿Hay alguna manera de activar mediante programación un evento de clic de botón? Tengo un botón colocado allí en una UIView, y en un escenario particular quiero hacer clic en el botón a través del código, no manualmente como usuario. ¿Es posible en el desarrollo de iOS? Proporcione sus sugerencias y guíeme cómo hacerlo.

Gracias.

Getsy
fuente

Respuestas:

313

Algo así como la respuesta de Ken, pero más flexible, ya que hará un seguimiento de las acciones reales de los botones si los cambia o agrega más de uno.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];
Zaky German
fuente
8
¿Esto resalta el botón si button.showsTouchWhenHighlighted = YESlo haría con un toque real?
Chown
2
Esta respuesta es excelente b / c, se puede traducir fácilmente a otros controles como UISwitch (UIControlEventValueChanged) y en mi caso es mucho mejor que llamar al código de destino / acción directamente b / c ¡Quiero que el switch cambie! Gracias.
John Erck
No, no resalta el botón si button.showsTouchWhenHighlighted = YES. ; (
Richie Hyatt
77
Si necesita el resaltado, puede hacerlo. [conjunto de botones resaltado: SÍ]; [botón sendActionsForControlEvents: UIControlEventTouchUpInside]; [conjunto de botones resaltado: NO]; y funciona muy bien -rrh
Richie Hyatt
Hola @zaky, si solo quiero animación, sin enviar acción, ¿cómo puedo hacerlo?
benhi
13

Tuve el mismo problema que el anterior. Hubiera publicado un comentario, pero mi reputación no es lo suficientemente alta. Entonces, en su lugar, publicaré la respuesta completa:

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

Esto presionará programáticamente el botón y lo resaltará durante una cantidad de tiempo aparentemente normal. La sugerencia de Richie no funcionó ya que el botón solo se resaltó (si es que lo hizo) durante un período de tiempo imperceptible.

Chad Hine
fuente
No estaba resaltado, el dibujo solo ocurre después de que el fragmento de código actual ha terminado de ejecutarse. Esta es una buena solución.
mattsven
6

¿Por qué no simplemente ejecutar el código que se ejecuta cuando el usuario presiona el botón?

-(void)myMethod
{
   // do stuff
}

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

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}
Evan Mulawski
fuente
No, mi requisito no es llamar al método, cómo activar el evento de clic del botón mediante programación, no cuando el usuario hace clic manualmente. Creé un UIButton programáticamente en una UIView, quiero activar el evento de clic de botón automáticamente después de un cierto intervalo de tiempo a través del programa en sí, no por el usuario.
Getsy
Entonces no es posible sin sintetizar el tacto. Ver cocoawithlove.com/2008/10/… . Sin embargo, no puede enviar su aplicación a la App Store utilizando este método, ya que utiliza una API privada. Normalmente se utiliza con fines de depuración.
Evan Mulawski
No explica por qué necesita simular un toque versus simplemente llamar al método, pero esa es, con mucho, la forma más fácil de hacerlo. La acción del temporizador puede llamar a cualquier método que desee y el método al que llama puede dar retroalimentación en la interfaz de usuario de que se está presionando el botón al cambiar el estado del botón (seleccionado, resaltado, etc.). Si eso no funciona, que así sea.
XJones
1

Si está hablando de un UIButton, simplemente puede llamar al mismo método que UIButton está llamando cuando se toca. Por ejemplo:

[self myButtonsTargetMethod];
Ken Pespisa
fuente
No, mi requisito no es llamar al método, cómo activar el evento de clic del botón mediante programación, no cuando el usuario hace clic manualmente. Creé un UIButton programáticamente en una UIView, quiero activar el evento de clic de botón automáticamente después de un cierto intervalo de tiempo a través del programa en sí, no por el usuario.
Getsy
1

Si,

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

Pero el problema aquí es que no podrá ver esos eventos porque es demasiado rápido. así que lo que puedes hacer es probar el código anterior con NSTimer.

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

MeFirst es el método que he creado.

Bharat jain
fuente