Pass variables from one ViewController to another in Swift

I have a calculator class, a first ViewController to insert the values and a second ViewController to show the result of the calculation. Unfortunately I get a error called “Can’t unwrap Optional.None” if I click the button. I know it’s something wrong with the syntax, but I don’t know how to improve it.

The button in the first Viewcontroller is set to “Segue: Show (e.g. Push)” in the storyboard to switch to the secondViewController if he gets tapped.

  • Replay kit Not working IPAD IOS11 BUG
  • How can I define Content-type in Swift using NSURLSession
  • what's wrong with my #if TARGET_OS_SIMULATOR code for Realm path definition?
  • How to get height of UITableView when cells are dynamically sized?
  • How to use Alamofire with custom headers for POST request
  • How to draw a route between two locations using MapKit in Swift?
  • the calculator class is something like:

    class Calculator: NSObject {
    
        func calculate (a:Int,b:Int) -> (Int) {
            var result = a * b
            return (result)
        }
    }
    

    The Viewcontroller calls the function, inserts a/b and wants to change the label which is located in the secondviewcontroller:

    class ViewController: UIViewController {
    
    @IBAction func myButtonPressed(sender : AnyObject) {
        showResult()
    }
    
    var numberOne = 4
    var numberTwo = 7
    
    var myCalc = Calculator()
    
    func showResult () {
        var myResult = myCalc.calculate(numberOne, b: numberTwo)
        println("myResult is \(String(myResult))")
        var myVC = secondViewController()
        myVC.setResultLabel(myResult)
    }
    

    And here is the code of the secondViewController

    class secondViewController: UIViewController {
    
    @IBOutlet var myResultLabel : UILabel = nil
    
    func setResultLabel (resultValue:Int) {
        myResultLabel.text = String(resultValue)
    }
    
    init(coder aDecoder: NSCoder!)
    {
        super.init(coder: aDecoder)
    }
    

    3 Solutions Collect From Internet About “Pass variables from one ViewController to another in Swift”

    In Swift, everything is public by default.
    Define your variables outside the classes:

    import UIKit
    
    var placesArray: NSMutableArray!
    
    class FirstViewController: UIViewController {
    //
    ..
    //
    }
    

    and then access it

    import UIKit
    
    class TableViewController: UITableViewController {
    //
    placesArray = [1, 2, 3]
    //
    }
    

    The problem here is that the FirstViewController has no reference to the instance of SecondViewController. Because of this, this line:

    secondViewController.setResultLabel(myResult)
    

    does nothing (except probably causing the Can't unwrap Optional.None error). There are a few ways to solve this problem. If you are using storyboard segues you can use the -prepareForSegue method of UIViewController. Here is an example:

    In FirstViewController:

    override func prepareForSegue(segue: UIStoryboardSegue!,sender: AnyObject!){         
      //make sure that the segue is going to secondViewController
      if segue.destinationViewController is secondViewController{
        // now set a var that points to that new viewcontroller so you can call the method correctly
        let nextController = (segue.destinationViewController as! secondViewController)
        nextController.setResultLabel((String(myResult)))
      }
    }
    

    Note: this code will not run as is because the function has no access to the result variable. you’ll have to figure that out yourself 🙂

    I think the issue here is, you are trying to set the UI component (here, its the label : myResultLabel)

    When segue is fired from first view controller, the second view has not yet been initialized. In other words, the UI object “myResultLabel” is still nil.

    To solve this, you will need to create a local string variable in second controller. Now, set that string to what you are trying to display, and finally, set the actual label in “viewDidLoad()” of the second controller.

    Best Regards,
    Gopal Nair.