【问题标题】:Get button pressed id on Swift via sender通过发件人在 Swift 上获取按钮按下的 id
【发布时间】:2015-05-05 07:19:32
【问题描述】:

所以我有一个带有 3 个按钮的故事板,我想为所有这 3 个按钮创建 1 个操作,并根据它们的标签/id 决定要做什么...

有没有办法为每个按钮获取某种标识符?

顺便说一句,它们是图像,所以它们没有标题。

@IBAction func mainButton(sender: UIButton) {
    println(sender)
}

【问题讨论】:

  • 是的,它是一个带有背景图片的按钮

标签: swift uibutton


【解决方案1】:

您可以在情节提要中为每个按钮设置tag。然后你可以这样识别它们:

@IBAction func mainButton(sender: UIButton) {
    println(sender.tag)
}

编辑:为了提高可读性,您可以定义一个枚举,其值对应于所选标签。因此,如果您为按钮设置0、1、2 之类的标签,则可以在类声明上方执行以下操作:

enum SelectedButtonTag: Int {
    case First
    case Second
    case Third
}

然后您将拥有以下内容,而不是处理硬编码的值:

@IBAction func mainButton(sender: UIButton) {
    switch sender.tag {
        case SelectedButtonTag.First.rawValue:
            println("do something when first button is tapped")
        case SelectedButtonTag.Second.rawValue:
            println("do something when second button is tapped")
        case SelectedButtonTag.Third.rawValue:                       
            println("do something when third button is tapped")
        default:
            println("default")
    }
}

【讨论】:

    【解决方案2】:

    如果你想用单一方法创建 3 个按钮,那么你可以通过以下代码来做到这一点...试试这个

    斯威夫特 3
    示例:-

    override func viewDidLoad()
    {
        super.viewDidLoad()
        Button1.tag=1
        Button1.addTarget(self,action:#selector(buttonClicked),
                          for:.touchUpInside)
        Button2.tag=2
        Button2.addTarget(self,action:#selector(buttonClicked),
                          for:.touchUpInside)
        Button3.tag=3
        Button3.addTarget(self,action:#selector(buttonClicked),
                          for:.touchUpInside)
    
    }
    
    func buttonClicked(sender:UIButton)
    {
        switch sender.tag
        {
            case 1: print("1")     //when Button1 is clicked...
                break
            case 2: print("2")     //when Button2 is clicked...
                break
            case 3: print("3")     //when Button3 is clicked...
                break
            default: print("Other...")
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以为您的按钮创建一个插座,然后实现:

      @IBAction func mainButton(sender: UIButton) {
          switch sender {
          case yourbuttonname:
              // do something
          case anotherbuttonname:
              // do something else
          default: println(sender)
          }
      }
      

      【讨论】:

      • 虽然使用 sender 标签属性有效,但恕我直言,这是最简单的解决方案,也是最容易管理的,因为您不必跟踪故事板中哪个标签属于哪个按钮(或其他对象) .
      【解决方案4】:

      斯威夫特 4 - 5.1

      @IBAction func buttonPressed(_ sender: UIButton) {
              if sender.tag == 1 {
                  print("Button 1 is pressed")
              }
      }
      

      【讨论】:

      • 你在哪里设置标签?
      • 你可以在storyboard -> Attributes Inspector -> View -> Tag中设置标签,也可以在viewDidLoad()生命周期函数中设置标签
      【解决方案5】:

      您必须将 tag 值设置为您需要的值并使用它访问它

      sender.tag
      

      【讨论】:

        【解决方案6】:

        假设你给他们所有正确的名字作为@IBOutlets:

        @IBOutlet var weak buttonOne: UIButton!
        @IBOutlet var weak buttonTwo: UIButton!
        @IBOutlet var weak buttonThree: UIButton!
        

        您可以使用以下内容来确定哪个是哪个

        @IBAction func didPressButton(sender: AnyObject){
         // no harm in doing some sort of checking on the sender
         if(sender.isKindOfClass(UIButton)){
        
            switch(sender){
            case buttonOne:    
                           //buttonOne action  
                           break
            case buttonTwo:   
                          //buttonTwo action  
                           break
            case buttonThree: 
                          //buttonThree action  
                           break
            default:
                           break
            }
        }
        

        【讨论】:

          【解决方案7】:

          Swift 3 代码: 在 xcode 中请先为每个按钮设置标签,然后才能使用以下代码。

          @IBAction func threeButtonsAction(_ sender: UIButton) {
          
                  switch sender.tag {
                  case 1:
                      print("do something when first button is tapped")
                      break
                  case 2:
                      print("do something when second button is tapped")
                      break
                  case 3:
                      print("do something when third button is tapped")
                      break
                  default:
                      break
                  }
              }
          

          【讨论】:

            【解决方案8】:

            你可以这样做,只是你必须给所有的按钮标签,然后这样做:

            @IBAction func mainButton(sender: AnyObject)
                {
                    switch sender.tag {
                    case 1:
                        println("do something when first button is tapped")
                    case 2:
                        println("do something when second button is tapped")
                    case 3:
                        println("do something when third button is tapped")
            
                    default:
                        println("default")
                    }
            
                }
            

            【讨论】:

              【解决方案9】:

              改为使用 outlet,标签会使代码混乱,使可读性更差。想想接下来阅读代码并看到 if sender.tag = 381 { // do some magic } 的可怜的开发人员,这没有任何意义。

              我的例子:

              class PhoneNumberCell: UITableViewCell {
                @IBOutlet weak var callButton: UIButton!
                @IBOutlet weak var messageButton: UIButton!
              
                @IBAction func didSelectAction(_ sender: UIButton) {
                  if sender == callButton {
                    debugPrint("Call person")
                  } else if sender == messageButton {
                    debugPrint("Message person")
                  }
                }
              
                [...]
              }
              

              您也可以在一个不错的 switch 中执行此操作,这样会更好。

              在 Swift 5.1 上测试

              【讨论】:

                【解决方案10】:

                斯威夫特 4

                在按钮上添加标签

                let button = UIButton()
                button.tag = 10
                

                点击事件

                @IBAction func mainButton(sender: UIButton) {
                    switch sender.tag {
                   
                    case 10:
                        print("10")
                    case 11:
                        print("11")
                  
                    default:
                         print("yes")
                    }
                }
                

                【讨论】:

                  【解决方案11】:

                  在这种情况下,您可以使用NSObject extension Accessibility Element UIAccessibility。

                  我用过accessibilityLabel 和accessibilityIdentifier 都成功了调用和条件检查。

                  第一 您可以在情节提要中为身份检查器中的每个按钮设置辅助功能Label 或Identifier。应启用辅助功能。

                  通过

                  检查/识别按钮
                  @IBAction func selectionPicker(_ sender: UIButton){
                          if sender.accessibilityLabel == "childType"{ //Check by accessibilityLabel
                              print("Child Type")
                          }
                          if sender.accessibilityIdentifier == "roomType"{ //Check by accessibilityIdentifier
                              print("Room Type")
                          }
                          performSegue(withIdentifier: "selectionViewSegue", sender:sender)
                      }
                  

                  在带有 Xcode 9.0 的 Swift 3.2 和 4.0 上

                  【讨论】:

                    【解决方案12】:

                    鉴于您将按钮标记为“1”、“2”、“3”:

                    @IBAction func mainButton(sender: UIButton) {
                        switch sender.titleLabel?.text {
                            case "1":
                                print("do something when first button is tapped")
                            case "2":
                                print("do something when second button is tapped")
                            case "3":
                                print("do something when third button is tapped")
                            default:
                                () // empty statement or "do nothing"
                        }
                    }
                    

                    【讨论】:

                      【解决方案13】:

                      在我的情况下,就像上面的答案一样,我使用标签来识别特定按钮,我添加的是我添加了一个 UIButton 扩展,它添加了一个 id,以便我可以设置一个字符串 id

                      我有三个带有标签0, 1 and 2的按钮

                      然后创建扩展

                      extension UIButton {
                          var id: String {
                              let tag = self.tag
                      
                              switch tag {
                                  case 0:
                                      return "breakfast"
                      
                                 case 1:
                                     return "lunch"
                      
                                 case 2:
                                     return "dinner"
                      
                                 default:
                      
                                     return "None"
                             }
                          }
                        }
                      

                      当访问 IBAction 中的按钮时,我只需调用:

                      sender.id
                      

                      【讨论】:

                        【解决方案14】:

                        选择你的第一个按钮并给它标签0,然后选择第二个按钮并给它标签1等等,在行动中检查标签位并根据标签位执行你的功能。:

                        【讨论】:

                          【解决方案15】:

                          Swift 5.5

                          我在其他没有我的 ViewController 实例的类中有实用程序方法,因此我不会将发送的对象与 ViewController 的 IBOutlets 中定义的对象进行比较。

                          如果我可以在我的 UI 对象上使用简单的语言标识符,我不会使用标签。我宁愿使用简单的语言标识符而不是数字来识别我的对象,因为这对我来说更容易。只是另一种方式。

                          如果我需要使用实用程序方法,我会使用 sender 参数对其进行设置,这样我就可以发送按钮,然后根据 Storyboard 中按钮的分配标识来确定单击了哪个按钮。

                          例如:

                          class Utility {
                          
                              func doSomething(sender: Any?) {
                                  guard let button = sender as? NSButton else {
                                      print("Unable to set button from sender.")
                                      return
                                  }
                                  guard case buttonID = button.identifier?.rawValue else {
                                      print("Unable to get button identifier.")
                                      return
                                  }
                                  switch buttonID {
                                      case: "firstButton":
                                          _ = buttonID // Perform firstButton action
                                      case: "secondButton":
                                          _ = buttonID // Perform secondButton action
                                      case: "thirdButton":
                                          _ = buttonID // Perform thirdButton action
                                      default:
                                          // shouldn't get here - error?
                                  }
                              }
                          
                          }
                          

                          在我的 ViewController 中,我将以下按钮设置为 IBOutlets,它们在 Storyboard 中的标识相同。

                          @IBOutlet weak var firstButton: NSButton?
                          @IBOutlet weak var secondButton: NSButton?
                          @IBOutlet weak var thirdButton: NSButton?
                          

                          然后我有我的 IBActions:

                          @IBAction func firstButtonClicked(sender: Any?) {
                              utility.doSomething(sender: sender)
                          }
                          
                          @IBAction func secondButtonClicked(sender: Any?) {
                              utility.doSomething(sender: sender)
                          }
                          
                          @IBAction func thirdButtonClicked(sender: Any?) {
                              utility.doSomething(sender: sender)
                          }
                          

                          【讨论】:

                            【解决方案16】:
                            switch sender as! NSObject {
                            case self.buttoneOne:
                                println("do something when first button is tapped")
                            case self.buttoneTwo:
                                println("do something when second button is tapped")
                            default:
                                println("default")
                            }
                            

                            【讨论】:

                            • 您能否详细说明为什么您认为上述解决方案不合适?
                            猜你喜欢
                            • 2021-09-03
                            • 2020-09-25
                            • 2021-12-14
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多