PerformSegueWithIdentifier for didSelectRowAtIndexPath and IBAction

The code will open the first ViewController, and it works fine:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("openDates", sender: self.dates[indexPath.row])
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let tasksViewController = segue.destinationViewController as! TasksViewController
    tasksViewController.selectedList = sender as! Dates
}

This code opens the second ViewController, but it does not work:

    @IBAction func ShowDetails(sender: UIBarButtonItem) {
    self.performSegueWithIdentifier("openDetails", sender: sender)
}

Error message:

Failed to pass value of type dante.DetailsViewController (0x10b60b2e0) to dante.TasksViewController (0x10b60adc0).

+4
source share
1 answer

You call two separate segments and use the same code in prepareForSeguefor both, which means that you are trying to use two separate view controllers for the same view controller. Change your code to:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "openDates" {
        let tasksViewController = segue.destinationViewController as! TasksViewController
        tasksViewController.selectedList = sender as! Dates
    }
    else if segue.identifier == "openDetails" {
        let detailsViewController = segue.destinationViewController as! DetailsViewController 
        // Do stuff
        // If you're not doing stuff, remove this else if block
        // The if statement will still catch and prepare the other segue
    }
}
+3
source

All Articles