2016-06-16 3 views
5

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

+0

Да, его хорошая идея; D –

+0

Любая идея, как установить один вверх, который обрабатывает ibactions? – SwiftyJD

+0

Отправитель имеют много свойств: название, тег и другие. также вы можете создать свой собственный класс кнопок с идентификационным свойством. –

ответ

19

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

@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 в иерархии представлений, затем щелкните левой кнопкой мыши, чтобы перетащить соединение с действиями на каждую кнопку.

+1

Как вы можете подключить каждую кнопку к действию в раскадровке? Это не позволит мне нажать кнопку и перетащить в IBAction. – SwiftyJD

+4

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

+1

ОК, получилось, спасибо! – SwiftyJD

6

Да, инструкция switch - это путь сюда. Для UIButton вы связываете его с селектором, который вызывается, когда пользователь взаимодействует с кнопкой, как правило, с событием TouchUpInside. The addTarget method, and valid selector signatures (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 

    } 

} 

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

3

Я не хотел бы установить метку, если мы можем решить эту проблему без тега

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

    } 
} 
Смежные вопросы