如何在Swift中使用一个IBAction用于多个按钮?

时间:2016-06-16 22:58:11

标签: ios iphone swift uibutton

我有多个按钮,每个按钮都可以切换应用程序的语言。而不是必须为每个按钮创建多个IBAction是否有一种方法可以将它们全部连接到一个IBAction并根据按下的按钮更改语言?我认为在这种情况下使用switch语句会很好,但不能确定如何设置它。

3 个答案:

答案 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 {

    }
}