Runeaway3
Runeaway3

Reputation: 1449

Prepareforsegue not passing the appropriate value to destination Viewcontroller?

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.

Upvotes: 1

Views: 202

Answers (2)

Sahil
Sahil

Reputation: 9226

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
    }

Upvotes: 2

Anand Nimje
Anand Nimje

Reputation: 6251

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

Upvotes: 1

Related Questions