1

I have two viewcontrollers (one is tableVC) that I would like to pass information between. Here is code from that tableVC:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        var rowSelected = indexPath.row
        print(rowSelected) //always returns the correct integer

        func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

            let destViewController: newController = segue.destination as! newController
            newController.rowSelected = rowSelected
        }

        performSegue(withIdentifier: "rowSelected", sender: Any?.self)//segue to newController

    }

And here is the code for the newController that I want the info to be passed to:

 @IBOutlet weak var label: UILabel!

var rowSelected = Int()
override func viewDidLoad() {
    super.viewDidLoad()

    label.text = infoArray[rowSelected]

    print(rowSelected) //always logs 0 to the console, regardless of cell selection

}

I thought I had set this up appropriately, but for whatever reason the index called to the infoArray is always 0, no matter what cell is selected in the tableVC. Not sure what the problem is.

Runeaway3
  • 1,439
  • 1
  • 17
  • 43
  • http://stackoverflow.com/questions/39830552/swift-prepare-for-segue-send-data-from-one-view-controller-to-another/39845586#39845586 – Sanju Nov 14 '16 at 05:27
  • Need to call code with override func prepareForSegue out side of the didSelectRowAt and use performSegue inside the didSelectRowAt method . – Anand Nimje Nov 14 '16 at 07:46

2 Answers2

2

write prepareForSegue in class scope/global scope. in your code prepareForSegue will never call because you are writing this inside the method. pass rowSelected in performSegue and get rowSelected value in prepareForSegue using sender or you can use indexPathForSelectedRow property of tableView.

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
...

performSegue(withIdentifier: "rowSelected", sender: rowSelected)

}



override  func prepareForSegue(segue: UIStoryboardSegue, sender: Any?) {
        let  rowSelected = sender as! Int 

      // or you can use  indexPathForSelectedRow for getting row value
     // let indexPath = self.tableView.indexPathForSelectedRow?
     // let rowSelected = indexPath!.row


        let destViewController: newController = segue.destination as! newController
        newController.rowSelected = rowSelected
    }
Sahil
  • 9,096
  • 3
  • 25
  • 29
  • I tried this and am still getting a return of 0 in the second VC for rowSelected – Runeaway3 Nov 14 '16 at 05:32
  • have you debug your code? use breakpoints. check rowSelected value in prepareForSegue – Sahil Nov 14 '16 at 05:33
  • Without override your code will not work. See this answer also http://stackoverflow.com/a/39563880/4803556 – Anand Nimje Nov 14 '16 at 07:52
  • Actually my whole point was that to he should write prepareForSegue in global scope. and if you write prepareForSegue without override xcode doesn't compile your code and gives your error to correct it. and yes i missed it.Thanks – Sahil Nov 14 '16 at 08:44
  • 1
    Well no problem only with override that guy got error otherwise you was right there and corrected my view for your answer. @Sahil – Anand Nimje Nov 14 '16 at 08:59
  • If I add `override` to `prepareForSegue` I get the error that "the method does not override any method its superclass" – Runeaway3 Nov 14 '16 at 17:30
  • Scratch that. Not sure why the error was showing up but I rewrote the code adding in `override` and it worked. – Runeaway3 Nov 14 '16 at 17:45
1

Need to use override in your function when you prepareForSegue

See below example code : -

Swift 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "ShowAttractionDetails" {

       let detailViewController = segue.destination
            as! AttractionDetailViewController

       let myIndexPath = self.tableView.indexPathForSelectedRow!
       let row = myIndexPath.row
       detailViewController.webSite = webAddresses[row]
    }
}

Swift 2.3

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
       if segue.identifier == "ShowAttractionDetails" {

           let detailViewController = segue.destination
                as! AttractionDetailViewController

           let myIndexPath = self.tableView.indexPathForSelectedRow!
           let row = myIndexPath.row
           detailViewController.webSite = webAddresses[row]
        }
    }

Source - Segue from UITableViewCell Taps in Swift & TableView Navigation using Storyboards in Xcode 8

Anand Nimje
  • 6,163
  • 4
  • 24
  • 43