Joe Leong
Joe Leong

Reputation: 95

performSegueWithIdentifier causes fatal error: unexpectedly found nil while unwrapping an Optional value

What I need was to detect which cell was selected on my tableView, and using the indexPath.row to get the index of my object array which is personList, and pass that data to another View Controller and print on the label.

However, I received an error fatal error: unexpectedly found nil while unwrapping an Optional value

Below are my codes.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
    selectedCell = indexPath.row
    performSegueWithIdentifier("DetailScreen", sender: nil)
}

override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) {
    //detailedView.personName = personList[selectedCell].GetPersonName()
    detailedView.LastNameLabel.text = personList[selectedCell].GetLastName()
}

Upvotes: 0

Views: 635

Answers (2)

Harikrishnan
Harikrishnan

Reputation: 8065

The problem is that you initialize the detailedView in the wrong way. Do it like this:

 // IMPORTANT: Override prepareForSegue for your purpose, not performSegueWithIdentifier
 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "DetailScreen" {
         // Do the initialization here. You don't need a global variable.
         if let detailedView = segue.destinationViewController as? PersonDetailScreen {
             //detailedView.personName = personList[selectedCell].GetPersonName()
             detailedView.LastNameLabel.text = personList[selectedCell].GetLastName()
         }
     }   
}

PS: You are overriding the wrong function.

EDIT

As mentioned in your comment didSelectRowAtIndexPath and prepareForSegue doesn't coexist because the method you used for creating the segue is wrong. And with that, your code is doing more wrong than doing the right thing. Right now you might have created the segue by control dragging starting from the UITableView prototype cell to the destination view controller. Now when you do this what happens is, you are telling that the segue must be performed on the clicking on that particular cell itself, which means you are setting its action right in the storyboard. So even if you don't implement didSelectRowAtIndexPath, your code will still navigate to the second ViewController when the cell is clicked. But your requirement is that you must do some custom operations when the cell is clicked and then navigate to the second viewcontroller. For doing that, delete the current segue and then create a new segue with the same identifier like the way you create a normal segue - by control dragging from the source ViewContoller(not the tableview cell prototype) to the destination view controller. Then replace the override func performSegueWithIdentifier(identifier: String, sender: AnyObject?) function with the function I have provided in my original answer and then your code will work smooth.

PS: Make sure your Identifier is named correctly.

'NSInvalidArgumentException', reason: 'Receiver (<PersonDisplay.FirstViewController: 0x7feabaec2870>) has no segue with identifier 'DetailScreen''

This happens since you haven't set the name for the segue correctly in the storyboard. So rectify that as well. Specify the identifier for the segue in the storyboard.

Upvotes: 1

vien vu
vien vu

Reputation: 4337

You should pass valuable to detailedView and assign to label in viewDidLoad:

detailedView.lastName = personList[selectedCell].GetLastName()

Go viewDidload of detailedView:

 detailedView.LastNameLabel.text = detailedView.lastName

Upvotes: 1

Related Questions