108

I know how to add an IBAction to a button by dragging from the interface builder, but I want to add the action programmatically to save time and to avoid switching back and forth constantly. The solution is probably really simple, but I just can't seem to find any answers when I search it. Thank you!

GingerHead
  • 8,130
  • 15
  • 59
  • 93
aggiesfan64
  • 1,133
  • 2
  • 7
  • 8

10 Answers10

227

Try this:

Swift 4

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

Objective-C

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

You can find a rich source of information in Apple's Documentation. Have a look at the UIButton's documentation, it will reveal that UIButton is a descendant of UIControl, which implements the method to add targets.

--

You'll need to pay attention to whether add colon or not after myAction in action:@selector(myAction)

Here's the reference.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Nick Weaver
  • 47,228
  • 12
  • 98
  • 108
  • What if I want to pass a parameter to the selector when my button is pressed (eg. I have a button inside a UITableViewCell and I want to pass the object in that cell when the cell's button is pressed)? – acecapades Mar 15 '12 at 05:59
  • 1
    @acecapades I think you are mixing two things. You can't attach a paramater like you could do with performSelector. The action pattern used by the UIControl descendant UIButton is to notifiy some target with a certain selector when controlEvent is triggered. When this happens in your case you could go up the superviews to see who is encapsulating your button and ask a method to resolve the tablecell to model relation and then do whatever you want with that. – Nick Weaver Mar 15 '12 at 08:25
  • 1
    I see. That makes sense. I think I understand what you're saying. Thanks for the tip Nick! – acecapades Mar 16 '12 at 08:01
  • can someone translate this in swift? –  Jun 29 '16 at 05:28
25

Swift answer:

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

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

Documentation: https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget

Cœur
  • 37,241
  • 25
  • 195
  • 267
Glauco Neves
  • 3,483
  • 1
  • 24
  • 36
  • What's the ":" for after "click" in the call to UIControl.addTarget? – dumbledad Jan 04 '16 at 11:29
  • 1
    Selectors have a `:` as placeholders for function arguments. Since `click` takes the `sender` argument, that is replaced with a `:` in the selector string. – Etan Jan 14 '16 at 10:29
  • This worked recently for me for Swift 3. button.addTarget(self, action: #selector(ViewController.click), for: UIControlEvents.touchUpInside) func click() { print("click") } Thanks @Glauco Neves for pointing us down the right track – uplearned.com Oct 12 '16 at 10:21
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];
Developer
  • 141
  • 1
  • 2
9

try this:

first write this in your .h file of viewcontroller

UIButton *btn;

Now write this in your .m file of 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];

write this outside viewDidLoad method in .m file of your view controller

- (IBAction)btnClicked:(id)sender
{
   //Write a code you want to execute on buttons click event
}
krushnsinh
  • 874
  • 1
  • 10
  • 11
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
  • 461
  • 4
  • 20
6

For Swift 3

Create a function for button action first and then add the function to your button target

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

button.addTarget(self, action: #selector(buttonAction),for: .touchUpInside)
SanRam
  • 936
  • 13
  • 13
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 

}
Fahim Parkar
  • 30,974
  • 45
  • 160
  • 276
  • please provide some comments explaining how your sample can help. – Nogard Oct 07 '13 at 14:39
  • UIButton *btnNotification=[UIButton buttonWithType:UIButtonTypeCustom]; btnNotification.frame=CGRectMake(130,80,120,40);//Button Frame Setting btnNotification.backgroundColor=[UIColor greenColor]; [btnNotification setTitle:@"create Notification" forState:UIControlStateNormal];//Set the title for button [btnNotification addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];//add Target For button [self.view addSubview:btnNotification];} -(void)btnClicked { // Here You can write functionality } – user2677311 Oct 08 '13 at 12:35
  • -(void)btnClicked { //here what ever you want you can set the action for button //Example:go to next viewcontroller nextviewController *nextPage=[nextviewController alloc]init]; [self.navigationController pushviewcontroller:nextPage animated:YES ]; } – user2677311 Oct 08 '13 at 12:39
2

UIButton inherits from UIControl. That has all of the methods to add/remove actions: UIControl Class Reference. Look at the section "Preparing and Sending Action Messages", which covers – sendAction:to:forEvent: and – addTarget:action:forControlEvents:.

odrm
  • 5,149
  • 1
  • 18
  • 13
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
  • 125
  • 2
  • 13
1

IOS 14 SDK: you can add action with closure callback:

let button = UIButton(type: .system, primaryAction: UIAction(title: "Button Title", handler: { _ in
            print("Button tapped!")
        }))

Getting a reference to the control sender

let textField = UITextField()
textField.addAction(UIAction(title: "", handler: { action in
    let textField = action.sender as! UITextField
    print("Text is \(textField.text)")
}), for: .editingChanged)

source

Ucdemir
  • 2,852
  • 2
  • 26
  • 44