Programaticamente clicar no evento de clique no botão?

126

Existe uma maneira de disparar programaticamente um evento de clique no botão? Eu tenho um botão colocado lá em um UIView, e em um cenário específico, eu quero clicar no botão via código, não manualmente como usuário. É possível no desenvolvimento do iOS? Por favor, forneça suas sugestões e me guie como fazer isso.

Obrigado.

Getsy
fonte

Respostas:

313

Mais ou menos como a resposta de Ken, mas mais flexível, pois acompanhará as ações reais dos botões se você as alterar ou adicionar mais de uma.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];
Zaky German
fonte
8
Isso destaca o botão, button.showsTouchWhenHighlighted = YEScomo faria com um toque real?
chown
2
Essa resposta é ótima, porque pode ser facilmente traduzida para outros controles, como UISwitch (UIControlEventValueChanged) e, no meu caso, é muito melhor do que chamar o código de destino / ação diretamente, porque eu quero que o switch mude! THX.
precisa
Não, não realça o botão se button.showsTouchWhenHighlighted = YES. ; (
Richie Hyatt
7
se você precisar do destaque, poderá fazer isso. [botão setHighlighted: YES]; [botão sendActionsForControlEvents: UIControlEventTouchUpInside]; [botão setHighlighted: NO]; e funciona muito bem. -rrh
Richie Hyatt
Olá @zaky, se eu quero apenas animação, sem ação de envio, como posso fazê-lo?
22415 b1111:
13

Eu tive o mesmo problema que acima. Eu teria postado um comentário, mas minha reputação não é alta o suficiente. Então, postarei a resposta completa:

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

Programaticamente, pressione o botão e o destaque por um período aparentemente normal. A sugestão de Richie não funcionou, pois o botão só foi destacado (se houver) por um período imperceptível de tempo.

Chad Hine
fonte
Não foi destacado, o desenho ocorre apenas após a conclusão da execução da parte atual do código. Esta é uma boa solução.
mattsven
6

Por que não apenas executar o código que é executado quando o usuário pressiona o botão?

-(void)myMethod
{
   // do stuff
}

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

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}
Evan Mulawski
fonte
Não, meu requisito não é chamar o método, como acionar o evento de clique no botão programaticamente, não quando o usuário clica nele manualmente. Eu criei um UIButton programaticamente em um UIView, quero disparar um evento de clique no botão automaticamente após um certo intervalo de tempo através do próprio programa, não pelo usuário.
precisa saber é
Então não é possível sem sintetizar o toque. Veja cocoawithlove.com/2008/10/… . No entanto, você não pode enviar seu aplicativo para a App Store usando esse método, pois ele usa uma API privada. É normalmente usado para fins de depuração.
precisa saber é o seguinte
Você não explica por que precisa simular um toque ou apenas chamar o método, mas esse é de longe o caminho mais fácil. Sua ação do timer pode chamar qualquer método desejado e o método que ele chama pode dar um retorno na interface do usuário de que o botão está sendo pressionado alterando o estado do botão (selecionado, realçado, etc.). Se isso não funcionar, que assim seja.
XJones 11/11
1

Se você está falando de um UIButton, basta chamar o mesmo método que o UIButton está chamando quando é tocado. Por exemplo:

[self myButtonsTargetMethod];
Ken Pespisa
fonte
Não, meu requisito não é chamar o método, como acionar o evento de clique no botão programaticamente, não quando o usuário clica nele manualmente. Eu criei um UIButton programaticamente em um UIView, quero disparar um evento de clique no botão automaticamente após um certo intervalo de tempo através do próprio programa, não pelo usuário.
Getsy
1

Sim,

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

Mas o problema aqui é que você não poderá ver esses eventos porque é muito rápido. então o que você pode fazer é tentar o código acima com o NSTimer.

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

MeFirst é o método que eu criei.

Bharat jain
fonte