在我准备 segue 功能时,数据没有在正确的时间传输
data is not transferring at the right time in my prepare for segue function
这是我的代码。
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 传递给另一个。 didSelectRow 的工作完全符合预期。但是,准备功能 运行ning 晚了。例如,第一次代码是 运行,第二次 vc 将传递的值视为 nil。但是当我回去再做一次时,它说传递的值,但该值是之前完成的值。所以简单地说它就像准备功能落后或被延迟调用一样。
如果您将 tableview 的数据源 and/or 委托给您在界面生成器中的视图控制器,则可能会发生这种情况。根据代码的其余部分,视图控制器的初始化可能需要在初始化期间访问表视图的委托或数据源(即在控制器传递给 prepareForSegue 函数之前)。当它在 IB 中设置时,委托(或数据源)允许调用函数。
你是如何设置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)
}
快速警告
你真的应该小心使用强制展开 optionalVar!
和强制向下转型 thing = otherThing as! Type
。最好始终使用 if-let 和 guard-let 语句或可失败的向下转换 as?
。使用这些将减少开发难以发现的零值错误的机会。
这是我的代码。
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 传递给另一个。 didSelectRow 的工作完全符合预期。但是,准备功能 运行ning 晚了。例如,第一次代码是 运行,第二次 vc 将传递的值视为 nil。但是当我回去再做一次时,它说传递的值,但该值是之前完成的值。所以简单地说它就像准备功能落后或被延迟调用一样。
如果您将 tableview 的数据源 and/or 委托给您在界面生成器中的视图控制器,则可能会发生这种情况。根据代码的其余部分,视图控制器的初始化可能需要在初始化期间访问表视图的委托或数据源(即在控制器传递给 prepareForSegue 函数之前)。当它在 IB 中设置时,委托(或数据源)允许调用函数。
你是如何设置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)
}
快速警告
你真的应该小心使用强制展开 optionalVar!
和强制向下转型 thing = otherThing as! Type
。最好始终使用 if-let 和 guard-let 语句或可失败的向下转换 as?
。使用这些将减少开发难以发现的零值错误的机会。