I originally used this code in my prepare for segue and it worked correctly:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
let DetailViewController = segue.destination as! DetailViewController
let indexPath = tableView.indexPathForSelectedRow!
let selectedToDo = todos[indexPath.row]
DetailViewController.todo = selectedToDo
}
}
I am trying to add Master/Detail to my app so I modified my code below but now I get an Instance member 'todo' cannot be used on type 'DetailViewController' on the line below.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let indexPath = tableView.indexPathForSelectedRow {
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
let selectedToDo = todos[indexPath.row]
DetailViewController.todo = selectedToDo <This is the line showing the error instance member cannot be used >
controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
Any idea where my error might be?
In the original version:
let DetailViewController = segue.destination as! DetailViewControllerYou have a type (class) called "DetailViewController", but here you are shadowing (masking, hiding) that name by declaring a local variable with name "DetailViewController".
In the new version:
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewControllerThis time you called the local variable "controller", so "DetailViewController" isn't shadowed. So, in this:
DetailViewController.todo = selectedToDo
you're referring to the type (class), not the instance (object).
You're gonna run into problems like this if you capitalize variable names in Swift. The convention is to capitalize only types and protocols. Everything else should start with a lowercase letter.