Pass data through segue

106,450

Solution 1

Swift works exactly the same way as Obj-C but is reworked in the new language. I don't have a lot of information from your post but let's give a name to each TableViewController to help with my explanation.

HomeTableViewController (this is the screenshot you have above)

PlayerTableViewController (this is the player screen you want to travel to)

With that said, in PlayerTableViewController you need to have a variable that will store the passed data. Just under your class declaration have something like this (if you intend to store the struct as a single object rather than the array:

class PlayerTableViewController: UITableViewController {

    var programVar : Program?

    //the rest of the class methods....

After that there are two ways you can send data to the new TableViewController.

1) Using prepareForSegue

At the bottom of HomeTableViewController you will use the prepareForSegue methods to pass the data. Here is an example of the code you'll use:

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

    // Create a variable that you want to send
    var newProgramVar = Program(category: "Some", name: "Text")

    // Create a new variable to store the instance of PlayerTableViewController 
    let destinationVC = segue.destinationViewController as PlayerTableViewController
    destinationVC.programVar = newProgramVar
    }
}

Once PlayerTableViewController has loaded the variable will be already set and usable

2) Using didSelectRowAtIndexPath

If specific data needs to be sent based on which cell is selected you can use didSelectRowAtIndexPath. For this to work, you need to give your segue a name in the storyboard view (let me know if you need to know how to do this too).

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // Create a variable that you want to send based on the destination view controller 
    // You can get a reference to the data by using indexPath shown below
    let selectedProgram = programy[indexPath.row]

    // Create an instance of PlayerTableViewController and pass the variable
    let destinationVC = PlayerTableViewController()
    destinationVC.programVar = selectedProgram

    // Let's assume that the segue name is called playerSegue
    // This will perform the segue and pre-load the variable for you to use
    destinationVC.performSegueWithIdentifier("playerSegue", sender: self)
}

Let me know if you need any other info on this

Solution 2

With Swift 3 & 4

In The First ViewController (Send The Value)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "MainToTimer") {
        let vc = segue.destination as! YourViewController
        vc.verificationId = "Your Data"
    }
}

In the second viewController (Catch The Value)

var verificationId = String()

Solution 3

If you have no need to discern the action by the identifier but only by the target class...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? YourViewController {
        vc.var_name = "Your Data"
    }
}
Share:
106,450
patrikbelis
Author by

patrikbelis

I'm 17 years old iOS developer. I'm writing some codes from april 2014, living in Presov, Slovakia.

Updated on July 05, 2022

Comments

  • patrikbelis
    patrikbelis almost 2 years

    I'm doing simple iOS application with tableview controller and detailView. All I want is to pass data through segue.

    this is how it looks like

    this is how it looks.

    All I want is that u click on "Markíza" it will open URL video number 1 and if u click on "TV JOJ" it will open URL video number 2 in player.

    My tableview cells:

        struct Program {
            let category : String
            let name : String
        }
    
    
       var programy = [Program]()
            self.programy = [Program(category: "Slovenské", name: "Markíza"),
                             Program(category: "Slovenské", name: "TV JOJ")]
    
  • patrikbelis
    patrikbelis over 9 years
    sasha. check on my answer. I need to like. If will be clicked on CELL1 it will open link 1, If will be clicked on CELL2 it will open link2
  • althaus
    althaus over 9 years
    I tried the 2) approach and I always get an exception telling that "Receiver PlayerTableViewController has no segue with identifier 'playerSegue'". Just calling performSegueWithIdentifier works fine, but then no data is transfered to the new view. :[
  • Sasha Reid
    Sasha Reid over 9 years
    @althaus Have you made sure there is a segue named "playerSegue" in your storyboard? This image shows what you should look for. If that fails, send me some screenshots and I'll check it out. developer.apple.com/library/ios/recipes/…
  • althaus
    althaus over 9 years
    @SashaReid I worked around this by moving the logic to @prepareForSegue@, but after working some more with Xcode (new to the stuff), I guess I just had the direction of the segue wrong. The name was definitely ok.
  • Paulo Henrique Nonaka
    Paulo Henrique Nonaka about 8 years
    @althaus @SashaReid isn't better use indexPathForSelectedRow instead of didSelectRowAtIndexPath callback? Example: destinationVC.programVar = products[self.tableView.indexPathForSelectedRow!.row] in the prepareForSegue method. Let me know if I am wrong (I am new to the stuff too).
  • FortuneFaded
    FortuneFaded about 8 years
    @SashaReid I'm having the same issue as the one althuas mentioned in a previous comment. I'm attempting to do the 2nd method and am slightly confused. The segue is going from HomeTableVC to PlayerTableVC in the example, so why are we using destinationVC.performSegueWithIdentifier("playerSegue", sender: self) ? Isn't the current VC the one that's performing the segue?
  • Herno
    Herno over 5 years
    I think the last line which calls .performSegueWithIdentifier() should be invoked on self instead of destinationVc
  • DragonFire
    DragonFire almost 5 years
    var var_name = String() - use this in the second viewcontroller to catch the value