Search code examples
iosswiftclosuresuialertcontrolleruialertaction

How to pass multiple handlers in UIAlertAction


I've few buttons, clicking on these buttons present same alert. I've to handle each button click separately so I need to pass different handlers to each of these alerts. How do I do it?

I've searched for solutions but I can't find what I'm looking for, or may be It's there but I'm not able to understand it.

Following is my code snippet. Inside this function I can get which button is clicked but I'm not able to figure out how to call different handlers and pass them alert.title.

I hope someone can point me in right direction.

@IBAction func buttonClicked(_ sender: UIButton) {

    let alert = UIAlertController(title: "Select Value", message: nil, preferredStyle: .actionSheet)

    for list in self.listValue {
        alert.addAction(UIAlertAction(title: list.value, style: .default, handler: { _ in

            // How do I call different handlers here?
            // I'll need to retrieve alert.title in these handlers

        }))
    }

    alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
    self.present(alert, animated: false, completion: nil)
}

Solution

  • It's not totally clear what you're asking, but if you are trying to figure out which button was pressed so that you can execute different methods for each one you can do something like this:

    @IBAction func buttonClicked(_ sender: UIButton) {
        let alert = UIAlertController(title: "Select Value", message: nil, preferredStyle: .actionSheet)
        for list in self.listValue {
            alert.addAction(UIAlertAction(title: list.value, style: .default, handler: { (action) in
                // How do I call different handlers here?
                // I'll need to retrieve alert.title in these handlers
                switch action.title {
                case "Value A":
                    print("It's Value A")
                case "Value B":
                    print("It's Value B")
                default:
                    print("We didn't implement anything for this value")
                }
            }))
        }
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
        self.present(alert, animated: false, completion: nil)
    }