【问题标题】:How to use one IBAction for multiple buttons in Swift?如何在 Swift 中为多个按钮使用一个 IBAction?
【发布时间】:2016-10-18 15:36:23
【问题描述】:

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

【问题讨论】:

  • 是的,这是个好主意 ;D
  • 知道如何设置一个处理 ibactions 的方法吗?
  • sender 有很多属性:title、tag 等。您也可以使用标识属性创建自定义按钮类。

标签: ios iphone swift uibutton


【解决方案1】:

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

要将动作连接到多个按钮:在 Interface Builder 中,右键单击视图层次结构中的 ViewController,然后单击左键将动作连接拖动到每个按钮。

【讨论】:

  • 如何将每个按钮连接到情节提要中的动作?它不允许我单击按钮并拖动到 IBAction。
  • 在Interface Builder中,右键单击视图层次结构中的ViewController,然后左键单击将动作连接拖到每个按钮上
  • @CodeDifferent 我建议编辑您的帖子以包含您关于在 IB 中连接多个按钮的评论。它帮助了 OP,这就是我偶然发现这个问题的原因
  • @CodeDifferent 将适当的操作从多个按钮拖到一个操作似乎对我不起作用(XCode 9.3)。我可能做错了什么?
【解决方案2】:

是的,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 中的 case 语句必须是详尽无遗的,所以你必须包含一个默认 case,即使它永远不应该被调用。

【讨论】:

    【解决方案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 {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2022-01-26
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多