为什么我的数据没有从表视图传递到我的第二个视图控制器?

时间:2016-08-23 12:54:58

标签: swift uitableview segue

我试图将值传递给第二个视图控制器

 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

这是对原始代码的重大更新。

2 个答案:

答案 0 :(得分:1)

问题是,您要在第

行创建新的ViewController
var destination =  SecondViewController()

但是控制器只是解除分配,因为没有任何东西指向它(没有引用它并且它超出了范围)。你还没有进入它,也没有表现出任何想法。

如何解决?基本上有两种选择。

<强>故事板

如果您正在使用故事板,则必须在第一个ViewControllerSecondViewController之间创建一个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!

...然后让它超出范围而不显示,保存或做其他任何有用的事情。