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

如何以编程方式在视图控制器间传递动态数组?遇空数组问题求助

解决UITableView选中行后数组跨视图控制器传递为空的问题

这种问题我碰到过好多次,其实大多是细节没注意到,咱们一步步排查解决:

先排查最常见的几个坑

1. 你的数组是不是局部变量?

如果你的数组是在didSelectRowAt方法内部定义的,比如:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 错误:局部变量,方法结束后就销毁了
    var selectedItems = [String]()
    selectedItems.append(dataSource[indexPath.row])
    // 传递数组...
}

那肯定传递后是空的!你需要把数组声明为当前视图控制器的成员变量,比如在类顶部定义:

class SourceVC: UIViewController {
    // 正确:成员变量,生命周期和VC一致
    var selectedItems: [String] = []
    
    // ...其他代码...
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedItems.append(dataSource[indexPath.row])
        // 这里先打印验证:确认数组已经有元素了
        print("添加后数组:\(selectedItems)")
    }
}

2. 确认目标VC的数组属性正确声明

目标视图控制器里的接收数组要确保是可被外部赋值的,不要写成私有或者未初始化的可选类型(除非你特意需要):

class TargetVC: UIViewController {
    // 推荐:直接初始化空数组,避免nil问题
    var receivedItems: [String] = []
    
    // 或者可选类型,但使用时要解包
    // var receivedItems: [String]?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 在这里打印,而不是在init或者其他更早的生命周期方法里
        print("接收的数组:\(receivedItems)")
    }
}

根据跳转方式选择正确的传递方法

方式一:使用Storyboard Segue跳转

如果是通过Storyboard里的segue跳转,不要在didSelectRowAt里直接处理传递,而是配合prepare(for:sender:)方法:

// SourceVC的didSelectRowAt
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 先添加元素到数组
    selectedItems.append(dataSource[indexPath.row])
    // 触发segue(确保Storyboard里的segue ID和这里一致)
    performSegue(withIdentifier: "GoToTargetVC", sender: self)
}

// 重写prepare方法传递数据
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "GoToTargetVC" {
        // 强转目标VC,确保类型正确
        guard let targetVC = segue.destination as? TargetVC else {
            print("目标VC类型转换失败")
            return
        }
        // 传递数组
        targetVC.receivedItems = selectedItems
    }
}

方式二:手动初始化目标VC跳转

如果是纯代码创建并跳转目标VC,要确保赋值数组后再执行跳转:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 添加元素到数组
    selectedItems.append(dataSource[indexPath.row])
    
    // 初始化目标VC
    let targetVC = TargetVC()
    // 传递数组
    targetVC.receivedItems = selectedItems
    // 执行跳转(如果是导航控制器环境)
    navigationController?.pushViewController(targetVC, animated: true)
    // 如果是模态跳转
    // present(targetVC, animated: true)
}

最后验证步骤

  1. 在didSelectRowAt添加元素后立刻打印数组,确认元素已经被正确添加。
  2. 在目标VC的viewDidLoad(或viewWillAppear)里打印接收的数组,不要在初始化方法里打印(那时候还没赋值)。

按照这个流程走,基本就能解决数组传递为空的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:34:25