我试图将值传递给第二个视图控制器
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "headToDetail" {
let indexPath = self.tableView.indexPathForSelectedRow!.row
print("SELECTED INDEX \(indexPath)")
let destVC = segue.destinationViewController as! SecondViewController
print("Segue TEst \(self.toPass)")
destVC.vieSegue = self.toPass
}
我删除了didSelectRowAtIndexPath并且只是使用了Segue但是当我点击一个行单元格时,我得到了:
fatal error: unexpectedly found nil while unwrapping an Optional value
这是对原始代码的重大更新。
答案 0 :(得分:1)
问题是,您要在第
行创建新的ViewController
var destination = SecondViewController()
但是控制器只是解除分配,因为没有任何东西指向它(没有引用它并且它超出了范围)。你还没有进入它,也没有表现出任何想法。
如何解决?基本上有两种选择。
<强>故事板强>
如果您正在使用故事板,则必须在第一个ViewController
和SecondViewController
之间创建一个segue。你必须给它一个identifier
。
然后在didSelectRowAtIndexPath
中你会写
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let row = indexPath.row
print(fruits[row])
self.toPass = fruits[row]
performSegueWithIdentifier("YOUR_SEGUE_IDENTIFIER", sender: nil)
}
然后在prepareForSegue
中,您将该属性设置为目标SecondViewController
。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "YOUR_SEGUE_IDENTIFIER" {
let destVC = segue.destinationViewController as! SecondViewController
destVC.vieSegue = self.toPass!
}
}
手动推送
第二个选项是在didSelectRowAtIndexPath
方法
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let row = indexPath.row
print(fruits[row])
let destination = SecondViewController()
destination.vieSegue = fruits[row]
// if you are using navigation controller
navigationController?.pushViewController(destination, animated: true)
// if you want to present it modally
// presentViewController(destination, animated: true, completion: nil)
}
第二个版本并不强制您创建segues。
答案 1 :(得分:0)
它是空的,因为你创建了一个新对象......
var destination = SecondViewController()
...传递你的数据......
destination.vieSegue = self.toPass!
...然后让它超出范围而不显示,保存或做其他任何有用的事情。