通过Segue向数组追加元素异常:仅能追加一次且后续覆盖条目
嘿,这个问题我碰到过好多次啦,大概率是下面这几个常见原因,咱们一个个捋清楚:
目标视图控制器每次Segue都会被重新实例化
这是最常见的坑!如果你用的是Storyboard里的Segue跳转,每次触发Segue时,系统都会新建一个目标VC的实例,而不是复用之前的那个。也就是说,你上一次追加元素的数组只存在于已经被销毁的旧VC实例里,新打开的VC里的数组是初始状态(比如空数组),看起来就像是新元素覆盖了旧的。数组被意外重置初始化
检查一下目标VC的viewDidLoad、init或者其他初始化方法里,是不是每次都把数组重新赋值成空数组了?比如如果在viewDidLoad里写了myArray = [],那每次VC加载视图时,之前追加的内容都会被清空,自然就看不到历史数据了。传递数据时用了赋值而非追加
看看你在prepare(for:sender:)方法里的代码,是不是写成了destinationVC.myArray = [newItem]而不是destinationVC.myArray.append(newItem)?如果是直接给数组赋值一个只包含新元素的数组,那每次都会覆盖掉原来的内容,而不是追加。
如果想让数组能持续保留追加的元素,这里给你两个简单的方案:
用单例类存储数组
把数组放在一个全局的单例对象里,这样不管哪个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 } }让发起Segue的VC持有数组
把数组放在发起跳转的父VC里,每次Segue时把数组传给目标VC,目标VC修改数组后,通过闭包或者代理把更新后的数组回传给父VC,这样父VC就能持续保留最新的数组状态。
内容的提问来源于stack exchange,提问作者PerNil

