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
相关产品推荐
相关产品推荐

