与prepareForSegue错误“”意外地发现零,而解包一个可选值“”

我试图通过prepareForSegue函数从PFTableViewCell传递数据到下一个视图控制器(细节)。 我想我已经把正确的代码,但是当我运行应用程序,然后单击单元格,我的应用程序崩溃,我得到这个消息“意外地发现零,同时解开可选值”。 我已经尝试了prepareForSegue函数传递数据的许多变化,但它永远不会出现在下一个视图控制器。

在我的FirstViewController中,我写了这个代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "Detail" { if let destination = segue.destinationViewController as? ResponseViewController { let path = tableView?.indexPathForSelectedRow! let cell = tableView!.cellForRowAtIndexPath(path!) as! Post destination.name = (cell.name.text!) destination.message = (cell.message.text!) } 

以下是显示在ResponseViewController中传递的数据的代码:

  var name = String?() var message = String?() @IBOutlet weak var userName: UILabel! @IBOutlet weak var userMessage: UILabel! override func viewDidLoad() { super.viewDidLoad() userName.text! = name! userMessage.text! = message! } 

现在我该如何解决这个问题或更好,但我怎样才能在迅速2.0准备ForSegue?

其中一个可选variables包含nil

使用'!' 强制解包可选值。 如果一个可选包含nil,当它被解包时,你的程序会崩溃,并显示这个错误信息。 尽量避免使用强制转换( as! )和强制解包。

这里是一个零安全的版本

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "Detail" { if let destination = segue.destinationViewController as? ResponseViewController , path = tableView?.indexPathForSelectedRow , cell = tableView?.cellForRowAtIndexPath( path ) as? Post { destination.name = cell.name.text ?? "nil" destination.message = cell.message.text ?? "nil" } 

 var name: String? var message: String? @IBOutlet weak var userName: UILabel? @IBOutlet weak var userMessage: UILabel? override func viewDidLoad() { super.viewDidLoad() userName?.text = name ?? "nil" userMessage?.text = message ?? "nil" } 

注意:

  • ?? 是无合并操作符。 如果左边的值是 ,则右边的值被replace。
  • 您可以select使用?.调用可选值的方法?. 访问。 如果左边的值是nil ,结果将会短路到nil