Targets and Actions

You use a mechanism similar to delegation when you're working with controls in Cocoa Touch. When you tap on a button, drag a slider to adjust the volume, or toggle a switch, these user interface elements need to notify other parts of the application of this state change. So how do these controls let everything know what's going on?

The notification occurs using a target-action design pattern. In other words, you can set up each control with a target—an object that will be notified of the change. As with a delegate, you can choose any object.

Unlike with a delegate, the action can be any method defined by the object. The important thing is that the method conforms to one of these two signatures:

- (IBAction)actionOne {
}
- (IBAction)actionTwo:(id)sender {
}

Interface Builder uses IBAction to identify the actions in your code (explained in detail later). The second form takes a single parameter that contains the object that sent the action. The sender can be used while you're processing the action.

If you have a single action that's used by several instances of UIButton, you can use the sender to determine which button triggered the action. Another use for the sender is to query the control's state. For example, if you received an action from a UISwitch control, you'll want to know whether the switch is on or off:

- (IBAction)toggleSwitch:(id)sender { // sender is an instance of UISwitch, so use its -on method: if ([sender on]) { NSLog(@"AFFIRMATORY DIXIE CUP"); } ...

Get iPhone App Development: The Missing Manual now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.