performSegueWithIdentifier导致致命错误:在展开Optional值时意外发现nil

时间:2015-11-18 07:18:13

标签: swift2 segue

我需要的是检测我的tableView上选择了哪个单元格,并使用indexPath.row获取我的对象数组的索引personList,并将该数据传递给另一个View Controller和打印在标签上。

但是,我收到了错误fatal error: unexpectedly found nil while unwrapping an Optional value

以下是我的代码。

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()
}

2 个答案:

答案 0 :(得分:1)

您应该将有价值的内容传递给detailedView并在viewDidLoad中分配给标签:

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

go viewDidload of detailedView:

 detailedView.LastNameLabel.text = detailedView.lastName

答案 1 :(得分:1)

问题是你以错误的方式初始化detailedView。这样做:

 // 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:你正在重写错误的功能。

修改

正如评论didSelectRowAtIndexPathprepareForSegue中提到的那样,并不存在,因为您用于创建segue的方法是错误的。有了它,你的代码做错了比做正确的事情。现在,您可能已经通过控制拖动从UITableView原型单元格到目标视图控制器创建了segue。现在,当您执行此操作时,您告诉必须在单击特定单元格本身时执行segue,这意味着您正在故事板中设置其操作。因此,即使您未实现didSelectRowAtIndexPath,您的代码仍会在单击单元格时导航到第二个ViewController。但是您的要求是在单击单元格时必须执行一些自定义操作,然后导航到第二个视图控制器。为此,删除当前segue,然后创建一个新的segue,其标识符与创建普通segue的方式相同 - 通过控制从源ViewContoller(不是tableview单元原型)拖动到目标视图控制器。然后将override func performSegueWithIdentifier(identifier: String, sender: AnyObject?)函数替换为我在原始答案中提供的函数,然后您的代码将顺利运行。

PS:确保您的标识符名称正确。

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

这是因为您没有在故事板中正确设置segue的名称。所以纠正这一点。在故事板中指定segue的标识符。