Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use one IBAction for multiple buttons in Swift?

I have multiple buttons each one with the ability to switch the language of the app. Instead of having to create multiple IBActions for each button is there a way to have them all connected to one IBAction and change the language based on the button pressed? I'm thinking a switch statement would be good to use in this situation but not exactly sure how to set it up.

like image 993
SwiftyJD Avatar asked Jun 16 '16 22:06

SwiftyJD


2 Answers

In Interface Builder, select the Attributes Inspector and set the Tag for each button with a unique number, then you can do something like this:

@IBAction changeLanguage(sender: AnyObject) {
    guard let button = sender as? UIButton else {
        return
    }

    switch button.tag {
    case 1:
        // Change to English
    case 2:
        // Change to Spanish
    case 3:
        // Change to French, etc
    default:
        print("Unknown language")
        return
    }
}

To connect the action to multiple buttons: in Interface Builder, right-click ViewController in the view hierarchy, then left-click to drag the action connection to each button.

like image 162
Code Different Avatar answered Sep 23 '22 17:09

Code Different


Yes, a switch statement is the way to go here. For a UIButton, you link it to a selector that is called when the user interacts with the button, generally the TouchUpInside event. The addTarget method, and valid selector signatures (apple.com) Of these, you want to use a method in the format @IBAction func doSomething(sender: UIButton) or @IBAction func doSomething(sender: UIButton, forEvent event: UIEvent), so that a reference to the button that triggered the event is passed to the selector.

In your ViewController code, you'll have references to your UIButtons (possibly in a storyboard, or created manually.) Let's say you have

@IBOutlet weak var frenchButton: UIButton!
@IBOutlet weak var spanishButton: UIButton!
@IBOutlet weak var englishButton: UIButton!

You would connect all of them to the same method, and branch the logic based on which one was the sender. e.g.:

@IBAction func changeLanguage(sender: UIButton) {
    switch sender {
    case frenchButton:
        // Change Language to French
        print ("C'est si bon")
    case spanishButton:
        // or Spanish
        print ("Muy Bueno")
    case englishButton:
        // or English
        print ("It's pretty cool")
    default:
        break

    }

}

Note: Case statements in Swift must be exhaustive, so you have to include a default case, even though it should never be called.

like image 30
Hayden McCabe Avatar answered Sep 20 '22 17:09

Hayden McCabe