Swift中跨ViewController传递数组时collCells为何为空?
解决ViewController间数组传递为空的问题
看起来你遇到的核心问题是items2数组的内容没能正确传递到另一个ViewController的collCells数组里,我来帮你排查几个常见的坑:
1. 检查数据传递的时机和方式
你现在只展示了didSelectRowAt里添加元素到items2并保存的代码,但关键的传递逻辑没看到。如果是通过Segue跳转,你需要在prepare(for:sender:)方法里给目标VC的collCells赋值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "YourSegueIdentifier" { guard let targetVC = segue.destination as? TargetViewController else { return } // 直接传递当前的items2数组 targetVC.collCells = self.items2 // 如果依赖本地存储,这里可以触发目标VC读取数据的方法 // targetVC.loadSavedData() } }
如果是通过代码初始化目标VC,也要确保在push/present之前赋值:
let targetVC = TargetViewController() targetVC.collCells = self.items2 navigationController?.pushViewController(targetVC, animated: true)
2. 验证saveData2()和读取逻辑是否正确
你调用了saveData2(),但另一个VC是否正确读取了保存的数据?比如如果用UserDefaults保存,要确保读取的key和保存的一致:
// 保存的示例(假设Item实现了Codable) func saveData2() { do { let data = try JSONEncoder().encode(items2) UserDefaults.standard.set(data, forKey: "SavedItems2") } catch { print("保存失败:\(error)") } } // 目标VC读取的示例 func loadSavedData() { guard let data = UserDefaults.standard.data(forKey: "SavedItems2") else { collCells = [] return } do { collCells = try JSONDecoder().decode([Item].self, from: data) } catch { print("读取失败:\(error)") collCells = [] } }
可以在保存后打印items2.count,再在目标VC的viewDidLoad里打印collCells.count,确认数值是否匹配。
3. 检查Item的类型和分支逻辑
- 如果
Item是struct(值类型),items2.append(items[indexPath.row])添加的是副本,这没问题,但要确认是否进入了append的分支——比如items[indexPath.row].checked一开始是不是true,导致代码没执行添加操作?可以在didSelectRowAt里加打印:print("当前选中元素的checked状态:\(items[indexPath.row].checked)") print("添加后items2的数量:\(items2.count)") - 如果
Item是class(引用类型),要注意是否有意外修改导致数据变化,但这一般不会直接导致数组为空。
4. 确认跳转时items2的实际状态
在跳转前(比如prepare方法里)加个打印:
print("准备传递的items2数量:\(items2.count)")
如果这里打印是0,那说明didSelectRowAt里的逻辑没有正确向items2添加元素,需要回头检查条件判断是否符合预期。
内容的提问来源于stack exchange,提问作者Abhinav Khanduja
相关产品推荐
相关产品推荐

