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

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

在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,然后单击鼠标左键以将操作连接拖动到每个按钮。

是的,转换语句是这里的方式。 对于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 } } 

注意:Swift中的Case语句必须是详尽的,因此您必须包含一个默认情况,即使它永远不应该被调用。

如果您参考按钮,请不要设置标签。

您只需比较参考而不是标记。 这样,您就不会引入新的错误,因为与您自己键入的标记不同,引用是由编译器自动创建的。

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