通过发送者在Swift中获取按下按钮的ID

35

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

有没有一种方法可以为每个按钮获取某种标识符?

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

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

是的,这是一个带有背景图片的按钮。 - matt
16个回答

35

你可以在storyboard中为每个按钮设置一个tag,然后可以通过以下方式进行标识:

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

编辑: 为了更易读,您可以定义一个枚举类型,其值对应所选标签。因此,如果您为按钮设置标签,如 012,在类声明上方,您可以执行以下操作:

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")
    }
}

19
如果你想使用单个方法创建3个按钮,那么你可以按照以下代码进行操作... 请尝试此操作。 Swift 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...")
    }
}

9
你可以为你的按钮创建一个出口,然后实现以下内容:
@IBAction func mainButton(sender: UIButton) {
    switch sender {
    case yourbuttonname:
        // do something
    case anotherbuttonname:
        // do something else
    default: println(sender)
    }
}

在使用发送者标签属性时虽然有效,但在我看来,这是最简单的解决方案且易于管理,因为您不必跟踪哪个标签属于Storyboard中的哪个按钮(或其他对象)。 - B-Rad

7

Swift 4 - 5.1

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

2
你在哪里设置标签? - Daniel Patriarca
4
您可以在Storyboard中设置标签 -> 属性检查器 -> 视图 -> 标签,或者您可以在viewDidLoad()生命周期函数中设置标签。 - Jonas Deichelmann

5

您需要将tag值设置为所需的内容,并使用以下方式访问它:

sender.tag

5
假设您已经给它们所有正确的名称作为@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
    }
}

5

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

4
你可以这样做,只需要给所有的按钮添加标签,然后像这样操作:
@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")
        }

    }

3

Swift 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")
    }
}

3

使用outlets代替标签,标签会使代码混乱,降低可读性。想想那些接下来要阅读代码的可怜开发人员,他们看到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 上测试通过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接