Search code examples
xcodeswiftsegueprepare

PreparetoSegue Button Command to Another ViewController Swift


How do I preparetoSegue a button command to another ViewController? It seem my calculateButton is giving me an error code.

MainViewController

if (segue.identifier == "toCalculate") {

            let destViewController : CalcualteViewController = segue.destinationViewController as CalcualteViewController

            destViewController.calculateButton(sender: UIButton) {

                let dataone = data1.text.toInt() ?? 0

                let datatwo = data2.text.toInt() ?? 0

                let answercalculation = dataone * datatwo

                answer.text = "\(answercalculation)" + " psi"

            }

CalculateViewController

class CalcualteViewController: UIViewController {

    @IBOutlet weak var textlabel: UILabel!

    @IBOutlet var answer: UITextField!

    @IBOutlet var data1: UITextField!

    @IBOutlet var data2: UITextField!

    @IBAction func calculateButton(sender: AnyObject) {

    }

Solution

  • destViewController.calculateButton is a method of CalculateViewController. You have a closure hanging off the end of it when it doesn't accept any arguments accept sender: AnyObject. Move your logic into the CalculateViewController.

    @IBAction func calculateButton(sender: AnyObject) {
           let dataone = data1.text.toInt() ?? 0
           let datatwo = data2.text.toInt() ?? 0
           let answercalculation = dataone * datatwo
           answer.text = "\(answercalculation)" + " psi"
    }
    

    If you want to share the code across multiple controllers you could create an instance variable called var calculateButtonAction: ((UIButton) -> ())? and then set it in prepareForSegue:

    destinationViewController.calculateButtonAction = { (sender) in
       let dataone = destinationViewController.data1.text.toInt() ?? 0
       let datatwo = destinationViewController.data2.text.toInt() ?? 0
       let answercalculation = dataone * datatwo
       destinationViewController.answer.text = "\(answercalculation)" + " psi"
    }
    

    And then call it from CalculatorViewController:

    @IBAction func calculateButton(sender: AnyObject) {
         if let action = calculateButtonAction {
            action(sender)
         }
    }
    

    Better yet, create a BaseCalculatorViewController and subclass it for your controllers so you can have your subclasses inherit calculateButton.