我有多个按钮,每个按钮都可以切换应用程序的语言。而不是必须为每个按钮创建多个IBAction是否有一种方法可以将它们全部连接到一个IBAction并根据按下的按钮更改语言?我认为在这种情况下使用switch语句会很好,但不能确定如何设置它。
答案 0 :(得分:27)
在Interface Builder中,选择Attributes Inspector并为每个按钮设置一个唯一编号的Tag,然后你可以这样做:
@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
}
}
要将操作连接到多个按钮:,在界面生成器中,右键单击视图层次结构中的ViewController,然后单击鼠标左键以将操作连接拖动到每个按钮。
答案 1 :(得分:8)
是的,转换语句是这里的方法。对于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!
您可以将它们全部连接到同一个方法,并根据哪个是发件人来分支逻辑。 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
}
}
注意:Swift中的Case语句必须是详尽的,因此您必须包含一个默认大小写,即使它永远不会被调用。
答案 2 :(得分:7)
您只需比较参考而不是标记。这样,您就不会引入新的错误,因为与您自己键入的标记不同,引用是由编译器自动创建的。
@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 {
}
}