解决多prepare for segue方法向数组存值仅保留最后值的问题
解决Filteredoptions数组仅保留最后传入值的问题
这问题我碰到过好多次了,大概率是两个常见坑之一——要么你每次segue都在新建Filteredoptions实例,要么数组的初始化/赋值逻辑有问题。咱们一步步拆解解决:
先搞清楚核心问题
首先得明确你的业务逻辑:是每次跳转都需要打开一个全新的Filteredoptions页面,还是想在同一个页面里累计多次传入的值?这决定了不同的解决方案。
情况1:你想在同一个Filteredoptions实例中累计数据
这是最常见的误解——每次通过segue跳转,系统都会创建一个全新的Filteredoptions实例,之前实例里的数组数据自然会丢失,新实例只会有这次传入的值。要解决这个,你需要复用已有的实例:
步骤1:修正Filteredoptions的数组声明
先把未初始化的数组改成初始化好的空数组,避免可选型带来的问题:
class Filteredoptions: UIViewController { // 直接初始化空数组,不要用未初始化的可选型 var filteredArray: [YourDataType] = [] override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 用viewWillAppear替代viewDidLoad,因为viewDidLoad只执行一次 print("当前数组内容:\(filteredArray)") } }
步骤2:在发起segue的类中复用已有实例
在prepare(for:sender:)里先检查导航栈中是否已经存在Filteredoptions实例,存在就追加数据并回到该页面,不存在再创建新实例:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "YourSegueIdentifier" else { return } // 先查找导航栈中已有的Filteredoptions实例 if let existingVC = navigationController?.viewControllers.first(where: { $0 is Filteredoptions }) as? Filteredoptions { // 追加新值到已有数组 existingVC.filteredArray.append(yourNewValue) // 回到该页面 navigationController?.popToViewController(existingVC, animated: true) return } // 如果没有已有实例,创建新实例并初始化数组 let destinationVC = segue.destination as! Filteredoptions destinationVC.filteredArray.append(yourNewValue) }
情况2:你每次都需要新页面,但想保留之前的数据(少见)
如果确实需要每次打开新的Filteredoptions页面,但每个页面都要包含之前所有传入的值,那你需要把数组存在一个共享的地方,比如父控制器或者单例(单例要谨慎,避免内存泄漏):
示例:用父控制器持有共享数组
在发起segue的父控制器中声明共享数组:
class ParentVC: UIViewController { var sharedFilteredArray: [YourDataType] = [] override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard let destinationVC = segue.destination as? Filteredoptions else { return } // 先追加新值到共享数组 sharedFilteredArray.append(yourNewValue) // 把整个共享数组传给新页面 destinationVC.filteredArray = sharedFilteredArray } }
然后Filteredoptions里还是用初始化好的数组,在viewWillAppear中打印即可。
额外注意点
- 不要用
viewDidLoad打印数组:viewDidLoad只有在控制器第一次创建时执行,后续回到页面不会再触发,改用viewWillAppear才能每次看到最新数据。 - 避免直接覆盖数组:如果你的代码是
destinationVC.filteredArray = [yourNewValue],那每次都会把数组重置为只有新值的数组,一定要用append来追加。
内容的提问来源于stack exchange,提问作者Hussam Abedlatif
相关产品推荐
相关产品推荐

