在准备segue函数时,数据没有在正确的时间传输

时间:2017-05-08 22:10:49

标签: swift segue collectionview

这是我的代码。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow;
    let currentCell = tableView.cellForRow(at: indexPath!) as! monthTableViewCell!;

    valueToPass = (currentCell?.monthOutlet.text)!
    print(valueToPass)



}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "toMonthVC") {

        // initialize new view controller and cast it as your view controller
        let viewController = segue.destination as! monthCellViewController
        // your new view controller should have property that will store passed value
        viewController.dataFromHoursVC = valueToPass
    }
}

所以基本上我试图将值从一个VC传递到另一个VC。 didSelectRow正如预期的那样完美运作。但是,准备功能运行较晚。例如,第一次运行代码时,第二个vc将传递的值视为nil。但是当我回去然后再做一次时,它会说出传递的值,但是值是之前完成的值。所以简单地说它就像准备功能落后或被称为迟到。

2 个答案:

答案 0 :(得分:0)

如果在接口构建器中将tableview的数据源和/或委托给视图控制器,则可能会发生这种情况。根据代码的其余部分,视图控制器的初始化可能需要在初始化期间(即在将控制器传递给prepareForSegue函数之前)访问tableview的委托或dataSource。当它在IB中设置时,委托(或dataSource)允许调用函数。

答案 1 :(得分:0)

你是如何设置segue的?听起来在执行segue之前没有设置值。

尝试这样做:

enter image description here

在为segue提供识别名称后,请设置如下代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

   // Get Cell Label
   let indexPath = tableView.indexPathForSelectedRow;
   let currentCell = tableView.cellForRow(at: indexPath!) as! monthTableViewCell!;

   valueToPass = (currentCell?.monthOutlet.text)!
   print(valueToPass)

   // invoke the segue manually after value is set
   self.performSegue(withIdentifier: "SEGUEID", sender: self)
}

快速警告

你真的应该小心使用force unwraps optionalVar!并强制向下转发thing = otherThing as! Type。总是使用if-let和guard-let语句或失败的向下转换as?要好得多。使用这些将减少开发难以找到的零值错误的机会。