You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:如何返回带缓存数据的上一级View Controller

问题根因

你当前使用的segue跳转默认是每次触发都会创建新的目标视图控制器实例,之前在第二个VC里存储的用户时间选择数据是绑定在旧实例的内存中的,旧实例被销毁后,存储的输入内容自然会被清空。

可行解决方案

方案1:复用导航栈内已存在的第二个VC实例(实现成本最低,状态保留最完整)

如果你的页面是嵌套在UINavigationController中管理的,不要用segue从第四个页面往回跳转到第二个VC(这种方式会push新的VC实例,导航栈会越堆越多),直接用系统的pop方法回到栈里已经存在的第二个VC实例即可,旧实例的所有UI状态、用户输入都会完整保留:

// 第四个页面中触发修改时间的操作时执行
// 遍历导航栈找到已经存在的第二个VC实例
guard let targetVC = navigationController?.viewControllers.first(where: { $0 is SecondViewController }) as? SecondViewController else {
    // 极端情况栈里找不到第二个VC时,再走实例化初始化的逻辑
    let newVC = storyboard?.instantiateViewController(withIdentifier: "SecondVCID") as! SecondViewController
    newVC.savedTimeList = self.savedTimeList // 把已存的时间列表传过去
    newVC.needEditRow = targetEditRow // 传入需要定位修改的行号
    navigationController?.pushViewController(newVC, animated: true)
    return
}
// 传入需要定位修改的行号,让第二个VC直接滚动到对应单元格
targetVC.needEditRow = targetEditRow
navigationController?.popToViewController(targetVC, animated: true)
  • 记得提前给第二个VC设置Storyboard ID为SecondVCID,方便极端场景下实例化
  • 跳回第二个VC后,可以在viewWillAppear里判断如果有传入needEditRow,直接把tableView滚动到对应位置,弹出对应行的date-picker,用户直接修改即可

方案2:抽离独立数据层存储配置(符合MVC规范,长期维护最方便)

不要把用户选择的时间数据存在第二个VC的实例属性中,单独把时间配置存储在和VC生命周期解绑的位置,可选的存储位置包括:

  • 全局单例的状态管理类
  • 导航栈根视图控制器的属性
  • 本地轻量存储(比如UserDefaults,不需要持久化的临时状态也可以存在全局可访问的结构体里)

实现逻辑:

  • 初始化一个和决定条目数的array.count长度一致的时间数组,比如var savedTimeList: [Date] = Array(repeating: Date(), count: sourceArray.count),这个数组的生命周期独立于各个页面VC
  • 第二个VC加载时,直接读取这个独立存储的时间数组,给对应行的date-picker设置默认选中值
  • 用户操作date-picker修改时间时,实时把新值同步回这个独立存储的数组,不要等页面跳转时才批量存储
  • 无论后续新建多少个第二个VC的实例,只要读取这个独立存储的数组,就能直接还原所有之前填写的时间配置,用户只需要修改目标条目即可

注意:如果决定条目数的array动态增删,记得同步调整savedTimeList的长度:新增条目时对应位置补默认时间,删除条目时同步移除对应位置的时间值,避免tableView渲染时出现数组越界崩溃。

方案3:跳转时全量传值同步数据(适合页面层级少的简单场景)

如果不想调整现有跳转逻辑,也可以用正向传值的方式保留数据:

  • 从第二个VC跳转到第三个、第四个页面时,把当前已经填写完成的时间数组作为参数,一级一级传递到后续页面持有
  • 从第四个页面触发segue跳转回第二个VC时,在prepare(for:sender:)方法里,把第四个页面持有的完整时间数组、需要修改的目标行号,传给新创建的第二个VC实例
  • 第二个VC在viewDidLoad中用传入的时间数组刷新tableView,所有行的date-picker直接用传入的已存时间做默认值,也能实现无需重复填写的效果
  • 这个方案的缺点是页面层级多的时候需要逐级传值,容易漏传,后续维护成本更高。

内容的提问来源于stack exchange,提问作者Itzhak Duani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:36:07