27

I am trying to convert an app from Objective-C to Swift but I can't find how to pass data between views using Swift. My Objective-C code is

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
AnsViewController *ansViewController;
ansViewController = [storyBoard instantiateViewControllerWithIdentifier:@"ansView"];
ansViewController.num = theNum;
[self presentViewController:ansViewController animated:YES completion:nil];

What that is doing is it basically takes the variable, theNum, and passes it to the variable, num, on a different view controller. I know this may be an easy question but I am getting pretty confused with Swift so if someone could explain how they changed it to Swift that would be greatly appreciated!

Thanks

6
  • 2
    Its exactly the same in Swift, what exactly are you unsure about? Commented Jun 14, 2014 at 17:53
  • Just the Swift syntax in general. I know that I wouldn't be able to use the square brackets in Swift but in the eBook, it uses a . or parentheses at certain times and I'm not sure which one to use here Commented Jun 14, 2014 at 17:55
  • The dot and parentheses syntaxes are very general programming syntaxes found in almost every language. To be very brief, () is used to call a function, . accesses members/properties/functions of a class/struct/etc. Commented Jun 14, 2014 at 17:58
  • Thanks, I have most of it figured out now except for the ansViewController.num = theNum part because it says UIViewController does not have a member named theNum Commented Jun 14, 2014 at 18:07
  • 1
    @lagoon Would you mind accepting one of the answers? Commented Dec 9, 2015 at 2:26

7 Answers 7

37

Let's assumed we stand at the firstView go to the DetailView and want passing data from firstView to Detailview. To do that with storyboard, at the firstView we will have a method:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "segueTest") {
      //Checking identifier is crucial as there might be multiple
      // segues attached to same view
      var detailVC = segue!.destinationViewController as DetailViewController;
      detailVC.toPass = textField.text
    }
}

and then into the class of DetailView we declared a variable:

var toPass: String!

then you can use the variable toPass (of course you can change the type of the variable as you want, in this EX I just demo for string type).

Sign up to request clarification or add additional context in comments.

7 Comments

best solution if you need something quick and easy! Thanks
This looks like what I am needing. I want to pass an array of variables from VC 1 to VC 2. Then, in VC 2, the user will enter information into more fields. That information will be appended to the array. When done, the array is sent to the cloud. I copied your code into my project and replaced my var names. I am getting an error, 'DispScreenOne does not have a member named 'toPass'. {if (segue.identifier == "goToDispenseScreenTwo") { var DispScreenOne = segue.destinationViewController as! DispenseScreenTwoViewController; DispScreenOne.toPass = enteredDataArray.text }
@Greg: Please make sure at DispenseScreenTwoViewController, you have a variable name toPass
@Lee: I have a global var toPass. When I try to set a value to toPass in any of my view controllers, it recognizes the var. What am I missing?
You have a global variable toPass into your project doesn't mean DispenseScreenTwoViewController have this variable. So that you will get the error: 'DispScreenOne does not have a member named 'toPass'.
|
19
class AnsViewController: UIViewController {
   var theNum: Int

    override func viewDidLoad() {
        super.viewDidLoad()

        println(theNum)
    }

}

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    let viewController = self.storyboard.instantiateViewControllerWithIdentifier("ansView") as AnsViewController
    viewController.num = theNum
    self.presentViewController(viewController, animated: true, completion: nil)
}

2 Comments

where to give view controller identifier
@zainullah In the Storyboard ID.
2

To pass string or any data from one controller to another in swift.

Follows below steps:

1) Create property in child controller as var abc:string!

2) Create object of childcontroller

let storyboard:UIStoryboard()
let viewController: childcontroller = storyboard.instantiateViewControllerWithIdentifier("childcontroller") as! childcontroller
viewController.abc = "hello";
self.navigationController.pushviewController(Controller:viewController animated:true CompletionHandler:nil)

Comments

0
Using tableview,

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
        {
            let ClubProfileView = self.storyboard?.instantiateViewController(withIdentifier: "CBClubProfileViewController") as! CBClubProfileViewController

            let TempCulubDic:NSDictionary =
                ((ClubsListbyDateDic.object(forKey:((ClubsListbyDateDic.allKeys as! [String]).sorted(by: <)as NSArray).object(at: indexPath.section) as! String) as! NSArray).object(at: indexPath.row))as! NSDictionary

            let ClubId:String=(TempCulubDic.value(forKey: "club_id") as? String)!

            let CheckIndate:String=(TempCulubDic.value(forKey: "chekin_date") as? String)!

            ClubProfileView.ClubID=ClubId

            ClubProfileView.CheckInDate = CheckIndate

            // self.tabBarController?.tabBar.isHidden=true

            ClubProfileView.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(ClubProfileView, animated: true)
            }

Comments

0
     @IBAction func nextbtnpreesd(_ sender: Any) {

            let mystring = "2"
            performSegue(withIdentifier: "MusicVC", sender: mystring)
        }



override func prepare(for segue: UIStoryboardSegue, sender: Any?) {


        if let destination = segue.destination as? MusicVC{

            if let song = sender as? String{
                destination.strlablevalie = song
            }
        }
    }

//in MusicVC create string like:

 var strlablevalie:String!

1 Comment

it is not working unable to get value on second controller which is passed by first contrioller. – Chandni 2 mins ago edit
0

To pass string or any data from one controller to another in swift.

Follows below steps:

1) Create variable of type which you want like (String,Int) var test : String!

2) Create object of childcontroller

 let vc = self.storyboard?.instantiateViewController(withIdentifier: "Here identifier of your VC") as! (Here Name Of Your Controller)
 vc.test = "Hello" (Or any data which you want to pass)
 self.navigationController?.pushViewController(VC, animated: true)

That should solve your problem

Comments

-1

Note: if we are using storyboard

Step 1: Master controller :

    // table row which row was selected
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        println("You selected cell #\(indexPath.row)!")

        nextScreenRow = indexPath.row

        // get to the next screen
        self.performSegueWithIdentifier("dashboard_static_screen_segue", sender: self)

    }

and then;

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

        if (segue.identifier == "dashboard_static_screen_segue") {
            var detailController = segue.destinationViewController as StaticScreens;
            detailController.screenNumber = nextScreenRow
        }

    }// end prepareForSegue

step 2: Detail controller (StaticScreen)

// set variable into your detail controller

var screenNumber: NSInteger?

println("selected row \(screenNumber!)")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.