Reputation: 6723
I have 4 buttons that call one function. Depending on which button was pressed i need to hide button inside of function that called after pressing.I dont know which button was pressed so i tried to assign tags for each of 4 buttons to identify them by tag and use switch
I tried this
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
}
but this doesnt work compiler says about use of unresolved identifier 'sender'
How to do this correctly ?
EDIT:
Whole function
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.. }
Upvotes: 8
Views: 20403
Reputation: 715
I know this has been answered, but if you set this up in IB, then I would recommend you check if the button was pressed by using the @IBOutlet variables as cases.
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()
}
}
...
}
Now you hook up the buttons in your NIB to each @IBOutlet, and all of the buttons to the one @IBAction didHitButton.
This is pretty straight forward, and you don't have to worry about tags or changing names.
Upvotes: 1
Reputation: 1
Rather then using a switch statement you can just use the sender directly.
Note that you need to specify that the sender is a UIButton (therefore this will only work if the function is only called from a button).
@IBAction func submitButton(sender: UIButton) {
/* extra code here */
sender.enabled = false
}
This reduces the code and also allows you to add extra buttons without code changes.
Upvotes: 0
Reputation: 1442
Try this,
1) Assign tag for each button
Button1.tag=1
Button2.tag=2
Button3.tag=3
Button4.tag=4
2) Then check your common button action
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;
}
}
Upvotes: 11
Reputation: 2550
Why you always want to use tags to determine the UIButton ? If the called function has a sender parameter then you know the UIButton which called the function through this parameter.
func buttonClicked(sender: UIButton)
{
switch sender {
case button1: // Do something
case button2: // Do some other stuff
...
default: ()
}
}
Upvotes: 10
Reputation: 478
Put your code in like below as i shown:
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.
}
--> due to this you will get sender's property easily.
-->Also check that you didn't forgot to give tags to the UIButtons.
Upvotes: 4