Como você adiciona uma ação a um botão programaticamente no xcode

105

Eu sei como adicionar um IBAction a um botão arrastando do construtor de interface, mas quero adicionar a ação programaticamente para economizar tempo e evitar alternar constantemente. A solução provavelmente é muito simples, mas simplesmente não consigo encontrar nenhuma resposta quando procuro. Obrigado!

aggiesfan64
fonte

Respostas:

222

Experimente isto:

Swift 4

myButton.addTarget(self,
                   action: #selector(myAction),
                   for: .touchUpInside)

Objective-C

[myButton addTarget:self 
             action:@selector(myAction) 
   forControlEvents:UIControlEventTouchUpInside];

Você pode encontrar uma rica fonte de informações na documentação da Apple. Dê uma olhada na documentação do UIButton , ela revelará que o UIButton é um descendente do UIControl, que implementa o método para adicionar alvos .

-

Você precisará prestar atenção se adicionar dois pontos ou não após myActionem action:@selector(myAction)

Aqui está a referência .

Nick Weaver
fonte
E se eu quiser passar um parâmetro para o seletor quando meu botão for pressionado (por exemplo, eu tenho um botão dentro de um UITableViewCell e quero passar o objeto nessa célula quando o botão da célula é pressionado)?
acecapades
1
@acecapades Acho que você está misturando duas coisas. Você não pode anexar um parâmetro como faria com performSelector. O padrão de ação usado pelo UIButton descendente de UIControl é notificar algum alvo com um certo seletor quando controlEvent é acionado. Quando isso acontecer no seu caso, você pode subir nas supervisualizações para ver quem está encapsulando seu botão e pedir um método para resolver a relação entre tablecell e model e então fazer o que quiser com isso.
Nick Weaver
1
Entendo. Isso faz sentido. Acho que entendo o que você está dizendo. Obrigado pela dica Nick!
acecapades
alguém pode traduzir isso rapidamente?
23

Resposta rápida:

myButton.addTarget(self, action: "click:", for: .touchUpInside)

func click(sender: UIButton) {
    print("click")
}

Documentação: https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget

Glauco Neves
fonte
Qual é o ":" para depois de "clicar" na chamada para UIControl.addTarget?
dumbledad
1
Os seletores têm :como marcadores de posição para os argumentos da função. Uma vez que clickleva o senderargumento, ele é substituído por um :na string do seletor.
Etan
Isso funcionou recentemente para mim para Swift 3. button.addTarget (self, action: #selector (ViewController.click), para: UIControlEvents.touchUpInside) func click () {print ("click")} Obrigado @Glauco Neves por nos apontar no caminho certo
uplearnedu.com
14
CGRect buttonFrame = CGRectMake( 10, 80, 100, 30 );
        UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];
        [button setTitle: @"My Button" forState: UIControlStateNormal];
        [button addTarget:self action:@selector(btnSelected:) forControlEvents:UIControlEventTouchUpInside];
        [button setTitleColor: [UIColor redColor] forState: UIControlStateNormal];
[view addSubview:button];
Desenvolvedor
fonte
é possível adicionar 2 ou mais ações?
ErasmoOliveira
9

tente isto:

primeiro escreva isso em seu arquivo .h do viewcontroller

UIButton *btn;

Agora escreva isso em seu arquivo .m de viewcontrollers viewDidLoad.

btn=[[UIButton alloc]initWithFrame:CGRectMake(50, 20, 30, 30)];
[btn setBackgroundColor:[UIColor orangeColor]];
//adding action programatically
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];

escreva este método externo viewDidLoad no arquivo .m do seu controlador de visualização

- (IBAction)btnClicked:(id)sender
{
   //Write a code you want to execute on buttons click event
}
Krushnsinh
fonte
8
 CGRect buttonFrame = CGRectMake( x-pos, y-pos, width, height );   //
 CGRectMake(10,5,10,10) 

 UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];

 button setTitle: @"My Button" forState: UIControlStateNormal];

 [button addTarget:self action:@selector(btnClicked:) 
 forControlEvents:UIControlEventTouchUpInside];

 [button setTitleColor: [UIColor BlueVolor] forState:
 UIControlStateNormal];

 [view addSubview:button];




 -(void)btnClicked {
    // your code }
iOSDeveloper
fonte
6

Para Swift 3

Crie uma função para a ação do botão primeiro e, em seguida, adicione a função ao destino do botão

func buttonAction(sender: UIButton!) {
    print("Button tapped")
}

button.addTarget(self, action: #selector(buttonAction),for: .touchUpInside)
SanRam
fonte
3
UIButton *btnNotification=[UIButton buttonWithType:UIButtonTypeCustom];
btnNotification.frame=CGRectMake(130,80,120,40);
btnNotification.backgroundColor=[UIColor greenColor];
[btnNotification setTitle:@"create Notification" forState:UIControlStateNormal];
[btnNotification addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnNotification];


}

-(void)btnClicked
{
    // Here You can write functionality 

}
user2677311
fonte
forneça alguns comentários explicando como sua amostra pode ajudar.
Nogard
UIButton * btnNotification = [UIButton buttonWithType: UIButtonTypeCustom]; btnNotification.frame = CGRectMake (130,80,120,40); // Configuração do quadro do botão btnNotification.backgroundColor = [UIColor greenColor]; [btnNotification setTitle: @ "create Notification" forState: UIControlStateNormal]; // Definir o título do botão [btnNotification addTarget: self action: @selector (btnClicked) forControlEvents: UIControlEventTouchUpInside]; // adicionar botão Target For [self.view addSubview: btnNotification];} - (void) btnClicked {// Aqui você pode escrever a funcionalidade}
user2677311
- (void) btnClicked {// aqui o que você quiser, você pode definir a ação para o botão // Exemplo: ir para o próximo viewcontroller nextviewController * nextPage = [nextviewController aloc] init]; [self.navigationController pushviewcontroller: nextPage animated: YES]; }
user2677311
2

UIButtonherda de UIControl. Isso tem todos os métodos para adicionar / remover ações: Referência de classe UIControl . Veja a seção "Preparando e Enviando Mensagens de Ação", que cobre – sendAction:to:forEvent:e – addTarget:action:forControlEvents:.

odrm
fonte
1
 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
       action:@selector(aMethod1:)
forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Show View" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[view addSubview:button];   
Arjun Sa
fonte