文本框数据存入数组后新视图加载,返回新增数据不生效问题
嘿,我来帮你搞定这个问题!你遇到的情况我之前也踩过类似的坑——第一次存的数据能在新视图正常显示,但回到视图1更新数据再保存,历史记录就没法同步更新,核心问题大概率是数组的存储/传递方式不对,或者新视图没感知到数据变化。咱们一步步来解决:
第一步:先把数组的存储搞对
你现在是不是在Save方法里临时创建数组?比如每次点击保存都新建一个数组,那之前的数据肯定留不住,而且新视图拿到的只是当时的副本,后续更新自然同步不了。
推荐用单例类来统一管理数据,这样不管哪个视图都能拿到最新的数组:
// 写一个全局的数据管理类,专门存汇率记录 class CurrencyDataManager { static let shared = CurrencyDataManager() // 单例实例,全局唯一 var currencyRecords: [(sterling: String, euro: String)] = [] // 存记录的数组 private init() {} // 私有初始化,保证只能通过shared获取实例 }
然后修改你的Save方法,把数据存到单例里:
@IBAction func saveButtonTapped(_ sender: UIButton) { // 先判断文本框内容不为空 guard let sterlingVal = sterlingpoundTextField.text, let euroVal = euroTextField.text, !sterlingVal.isEmpty, !euroVal.isEmpty else { return } // 把新记录加到单例的数组里 CurrencyDataManager.shared.currencyRecords.append((sterling: sterlingVal, euro: euroVal)) }
注意:把文本框的名字改得清晰点,比如sterlingpoundTextField,避免和变量名重复,你原来代码里let sterlingpound = sterlingpound.text这种变量名重复的写法很容易出bug!
第二步:让新视图能拿到最新数据
如果新视图是用导航栈push过去的,那每次回到新视图时,要重新获取最新数据并刷新UI:
在新视图的viewWillAppear方法里做刷新:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 从单例拿最新的记录数组 let latestRecords = CurrencyDataManager.shared.currencyRecords // 这里刷新你的历史记录UI,比如用tableView的话就调用reloadData() yourHistoryTableView.reloadData() }
要是你希望新视图在后台时也能实时收到更新通知,可以用通知中心:
在视图1的saveButtonTapped方法末尾加一行:
// 发送数据更新的通知 NotificationCenter.default.post(name: NSNotification.Name("CurrencyDataUpdated"), object: nil)
然后在新视图里监听通知:
override func viewDidLoad() { super.viewDidLoad() // 监听数据更新通知 NotificationCenter.default.addObserver(self, selector: #selector(updateHistoryUI), name: NSNotification.Name("CurrencyDataUpdated"), object: nil) } @objc private func updateHistoryUI() { let latestRecords = CurrencyDataManager.shared.currencyRecords // 刷新UI yourHistoryTableView.reloadData() } // 记得在销毁视图时移除监听,避免内存泄漏 deinit { NotificationCenter.default.removeObserver(self) }
最后再检查一个细节
如果你的新视图是提前初始化好的(比如存在属性里),千万不要把数组直接赋值给新视图的属性——因为数组是值类型,赋值后新视图拿到的是副本,后续原数组更新不会同步到副本里。一定要让新视图每次都从单例取最新数据,或者用上面的通知方式。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

