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

通过Segue向数组追加元素异常:仅能追加一次且后续覆盖条目

嘿,这个问题我碰到过好多次啦,大概率是下面这几个常见原因,咱们一个个捋清楚:

最可能的原因分析
  • 目标视图控制器每次Segue都会被重新实例化
    这是最常见的坑!如果你用的是Storyboard里的Segue跳转,每次触发Segue时,系统都会新建一个目标VC的实例,而不是复用之前的那个。也就是说,你上一次追加元素的数组只存在于已经被销毁的旧VC实例里,新打开的VC里的数组是初始状态(比如空数组),看起来就像是新元素覆盖了旧的。

  • 数组被意外重置初始化
    检查一下目标VC的viewDidLoad、init或者其他初始化方法里,是不是每次都把数组重新赋值成空数组了?比如如果在viewDidLoad里写了myArray = [],那每次VC加载视图时,之前追加的内容都会被清空,自然就看不到历史数据了。

  • 传递数据时用了赋值而非追加
    看看你在prepare(for:sender:)方法里的代码,是不是写成了destinationVC.myArray = [newItem]而不是destinationVC.myArray.append(newItem)?如果是直接给数组赋值一个只包含新元素的数组,那每次都会覆盖掉原来的内容,而不是追加。

快速解决思路示例

如果想让数组能持续保留追加的元素,这里给你两个简单的方案:

  1. 用单例类存储数组
    把数组放在一个全局的单例对象里,这样不管哪个VC访问,都是同一个数组实例,不会因为VC销毁而丢失数据。比如:

    class DataStore {
        static let shared = DataStore()
        var savedItems: [String] = [] // 替换成你的元素类型
    }
    

    然后在Segue里追加元素:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let targetVC = segue.destination as? YourTargetVC {
            // 追加元素到共享数组
            DataStore.shared.savedItems.append("新元素")
            // 把共享数组传给目标VC用于展示
            targetVC.displayItems = DataStore.shared.savedItems
        }
    }
    
  2. 让发起Segue的VC持有数组
    把数组放在发起跳转的父VC里,每次Segue时把数组传给目标VC,目标VC修改数组后,通过闭包或者代理把更新后的数组回传给父VC,这样父VC就能持续保留最新的数组状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:32:15