【问题标题】:data is not transferring at the right time in my prepare for segue function在我为 segue 功能做准备时,数据没有在正确的时间传输
【发布时间】:2017-05-08 22:10:48
【问题描述】:

这是我的代码。

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 工作正常,符合预期。但是,准备功能运行迟了。例如,第一次运行代码时,第二个 vc 将传递的值视为 nil。但是当我回去然后再做一次时,它会说传递的值,但该值是之前完成的值。所以简单地说,它就像准备函数落后或被延迟调用一样。

【问题讨论】:

  • 你能出示你的valueToPass声明吗?
  • 这与 prepareforswgue 被延迟调用无关,因为每当您点击后退按钮时,视图都会被删除并再次创建第二次。请展示更多内容以了解实际情况
  • 您究竟在哪里访问monthCellViewController 中的dataFromHoursVC 变量?

标签: swift segue collectionview


【解决方案1】:

你是如何设置你的 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? 会好得多。使用这些将减少开发难以找到的 nil 值错误的机会。

【讨论】:

  • 这个答案解决了这个问题。我所做的是我在单元格和第二个视图控制器之间创建了一个 segue,而不是你上面显示的方式。所以我回去做了你所做的,现在一切都很好。非常感谢!
  • 没问题!很高兴我能帮上忙。
【解决方案2】:

如果您在界面生成器中设置表格视图的数据源和/或委托给您的视图控制器,则可能会发生这种情况。根据您的其余代码,视图控制器的初始化可能需要在初始化期间访问 tableview 的委托或数据源(即在控制器传递给 prepareForSegue 函数之前)。在 IB 中设置时,委托(或数据源)允许调用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2017-03-05
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多