Как использовать один IBAction для нескольких кнопок в Swift?

У меня есть несколько кнопок с возможностью переключения языка приложения. Вместо того, чтобы создавать несколько IBActions для каждой кнопки, есть ли способ подключить их все к одному IBAction и изменить язык на основе нажатой кнопки? Я думаю, что оператор switch было бы хорошо использовать в этой ситуации, но не совсем уверен, как его настроить.

3 ответов


в Interface Builder выберите инспектор атрибутов и установите тег для каждой кнопки с уникальным номером, затем вы можете сделать что-то вроде этого:

@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
    }
}

чтобы подключить действие к нескольким кнопкам: в Interface Builder щелкните правой кнопкой мыши ViewController в иерархии представлений, затем щелкните левой кнопкой мыши, чтобы перетащить соединение действия на каждую кнопку.


да, оператор switch-это путь сюда. Для UIButton вы связываете его с селектором, который вызывается, когда пользователь взаимодействует с кнопкой, обычно событием TouchUpInside. метод addTarget и допустимые подписи селектора (apple.com) из них вы хотите использовать метод в формате @IBAction func doSomething(sender: UIButton) или @IBAction func doSomething(sender: UIButton, forEvent event: UIEvent), Так что ссылка на кнопку, которая вызвала событие передается в селектор.

в коде ViewController у вас будут ссылки для ваших UIButtons (возможно, в раскадровке или созданных вручную.) Допустим, у вас есть

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

вы подключили бы их все к одному и тому же методу и разветвили бы логику, на основе которой был отправителем. например:

@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

    }

}

Примечание: операторы Case в Swift должны быть исчерпывающими, поэтому вы должны включить случай по умолчанию, даже если он никогда не должен вызываться.


Не задан тег, если у вас есть ссылка на кнопку.

вы можете просто сравнить ссылку вместо тегов. Таким образом, вы не будете вводить новую ошибку, потому что в отличие от тега, который вы вводите сами, ссылка создается автоматически компилятором.

@IBOutlet weak var firstButton: UIButton!
@IBOutlet weak var secondButton: UIButton!
@IBOutlet weak var thirdButton: UIButton!

@IBAction changeLanguage(sender: UIButton) {
    if sender == firstButton {

    } else if sender == secondButton {

    } else if sender == thirdButton {

    }
}