Swift - 使用 switch 判断哪个按钮被按下

8

我有4个按钮调用一个函数。根据按下的按钮,我需要在函数内隐藏按钮。我不知道哪个按钮被按下,所以我尝试为每个按钮分配标签来通过标签识别它们并使用switch语句。

我尝试了以下代码:

            switch sender.tag {
            case 1:
                self.button1.hidden = true
            case 2:
                self.button2.hidden = true
            case 3:
                self.button3.hidden = true
            case 4:
                self.button4.hidden = true

            }

但是这种方法不起作用,编译器报错说使用了未解决的标识符 'sender'

应该如何正确操作?

编辑:

整个函数如下:

  if self.allowMistakeVar {

        let mistakeAlert = UIAlertController(title: "Here is title!", message: "message of alert", preferredStyle: .Alert)
        let okay = UIAlertAction(title: "OK", style: .Cancel) { UIAlertAction in

            self.allowMistakeVar = false
            self.allowMistakeButton.enabled = false


            switch sender.tag {
            case answer1Text:
                self.answer1Text.hidden = true
            case answer2Text:
                self.answer2Text.hidden = true
            case answer3Text:
                self.answer3Text.hidden = true
            case answer4Text:
                self.answer4Text.hidden = true

            }

        }

        mistakeAlert.addAction(okay)
        self.presentViewController(mistakeAlert, animated: true, completion: nil )

    } else {

another case.. }


@Er. Kukadiya更新帖子 - Alexey K
@Poql 在按钮被按下后,我会检查标题是否等于变量A。如果不是,则调用函数,在其中我会检查另一个变量B是真还是假,如果为真,则需要隐藏被按下的按钮。 - Alexey K
@Poql还更新了问题,并附上了整个函数。 - Alexey K
我不是很明白。但是你应该使用 addTarget: 函数来指定需要调用哪个方法。然后使用标签来确定是哪个按钮触发了该函数。 - GaétanZ
2
为什么你总是想使用标签来确定UIButton?如果被调用的函数有一个sender参数,那么你可以通过这个参数知道调用该函数的UIButton。 - JulianM
显示剩余3条评论
5个回答

11
尝试这个, 1)为每个按钮分配标签
Button1.tag=1
Button2.tag=2
Button3.tag=3
Button4.tag=4

2) 然后检查您的常见按钮操作

func buttonClicked(sender: UIButton)
{
   switch sender.tag {
   case 1: self.sender.hidden = true //button1
           break;
   case 2: self.sender.hidden = true //button2
           break;
   case 3: self.sender.hidden = true //button3
           break;
   case 4: self.sender.hidden = true //button4
           break;
   default: ()
           break;
   }

}

10

为什么你总是希望使用标签来确定UIButton?如果被调用的函数有一个sender参数,那么你就可以通过这个参数知道调用该函数的UIButton。

func buttonClicked(sender: UIButton)
{
   switch sender {
   case button1: // Do something
   case button2: // Do some other stuff
   ...
   default: ()
   }

}

我不确定这个能否解决问题,因为他得到了错误信息。但是谢谢。我学到了一些东西。 - GaétanZ

4
请按如下方式输入您的代码(与我展示的一样):
func btnSomeButtonClicked(sender: UIButton)
{
let tag = sender.tag;
       //put your same code here and either use tag variable as i shown or put as you did.
}

-->由于这个,你将很容易地得到发送者的属性。

-->还要检查一下是否忘记为UIButtons添加标签。


1
我知道这个问题已经有答案了,但是如果你在IB中设置了这个,那么我建议你使用@IBOutlet变量作为情况来检查按钮是否被按下。
class SomeView: UIView {
    @IBOutlet weak var buttonA: UIButton!
    @IBOutlet weak var buttonB: UIButton!
    @IBOutlet weak var buttonC: UIButton!

    @IBAction func didHitButton(_ sender: UIButton) {
        switch sender {
        case buttonA:
            doThis()
        }
        case buttonB:
            doThat()
        }
        case buttonC:
            doThisAgain()
        }
        default:
            doNothing()
        }
    }
    ...
}

现在你需要将NIB中的按钮与每个@IBOutlet连接起来,并将所有按钮连接到一个@IBAction didHitButton中。
这很简单,您不必担心标签或更改名称。

0

与其使用 switch 语句,你可以直接使用发送者。

请注意,您需要指定发送者是 UIButton(因此仅当该函数仅从按钮调用时才起作用)。

@IBAction func submitButton(sender: UIButton) {

    /* extra code here */

    sender.enabled = false

}

这样可以减少代码量,同时也允许您添加额外的按钮而无需更改代码。


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