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

文本框数据存入数组后新视图加载,返回新增数据不生效问题

嘿,我来帮你搞定这个问题!你遇到的情况我之前也踩过类似的坑——第一次存的数据能在新视图正常显示,但回到视图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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:35:08