这是我的代码。
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。但是当我回去然后再做一次时,它会说出传递的值,但是值是之前完成的值。所以简单地说它就像准备功能落后或被称为迟到。
答案 0 :(得分:0)
如果在接口构建器中将tableview的数据源和/或委托给视图控制器,则可能会发生这种情况。根据代码的其余部分,视图控制器的初始化可能需要在初始化期间(即在将控制器传递给prepareForSegue函数之前)访问tableview的委托或dataSource。当它在IB中设置时,委托(或dataSource)允许调用函数。
答案 1 :(得分:0)
你是如何设置segue的?听起来在执行segue之前没有设置值。
尝试这样做:
在为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?
要好得多。使用这些将减少开发难以找到的零值错误的机会。