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

Swift实现从另一个TableView添加行的问题求助

解决点击单元格传递单个数据到目标VC并追加列表的方案

我来给你梳理下正确的实现步骤,你之前的问题核心是没在单元格点击时精准获取单个选中项,而是误传了整个数组,咱们一步步来改:

一、用协议代理实现(推荐方式)

1. 在ListTableViewController中定义协议和代理属性

首先在你的ListTableViewController类的顶部,先定义一个传递单个数据的协议:

// 假设你的数据模型是String,根据实际情况替换成你的模型类
protocol ListTableViewControllerDelegate: AnyObject {
    func didSelectItem(_ item: String)
}

class ListTableViewController: UITableViewController {
    // 你的数据源数组
    var dataArray: [String] = ["选项1", "选项2", "选项3"]
    // 定义代理属性
    weak var delegate: ListTableViewControllerDelegate?
    
    // ... 其他已有的代码(比如cellForRowAt等)
}

2. 实现单元格点击方法,传递单个选中项

在ListTableViewController里找到(或者添加)tableView(_:didSelectRowAt:)方法,这里就是点击单元格时触发的逻辑,我们在这里获取选中的单个数据,然后通过代理传递:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 获取选中的单个数据
    let selectedItem = dataArray[indexPath.row]
    // 调用代理方法传递数据
    delegate?.didSelectItem(selectedItem)
    // 可选:点击后取消单元格选中状态
    tableView.deselectRow(at: indexPath, animated: true)
    // 如果是通过push或present跳转的,这里可以返回上一页(如果需要)
    navigationController?.popViewController(animated: true)
}

3. 在DataAddedTableViewController中遵守协议并接收数据

在DataAddedTableViewController里,先遵守协议,然后实现代理方法,把传递过来的数据追加到自己的列表数组,再刷新表格:

class DataAddedTableViewController: UITableViewController, ListTableViewControllerDelegate {
    // 你的已添加数据数组
    var addedDataArray: [String] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // ... 其他初始化代码
    }
    
    // 实现代理方法
    func didSelectItem(_ item: String) {
        // 追加数据到数组
        addedDataArray.append(item)
        // 刷新表格
        tableView.reloadData()
    }
    
    // ... 其他表格代理方法(比如cellForRowAt、numberOfRowsInSection等,用addedDataArray作为数据源)
    
    // 跳转到ListTableViewController时,设置代理
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let listVC = segue.destination as? ListTableViewController {
            listVC.delegate = self
        }
    }
}

二、另一种可选方案:用闭包传递数据

如果你觉得协议代理有点繁琐,也可以用闭包来实现,步骤更简洁:

1. 在ListTableViewController中定义闭包属性

class ListTableViewController: UITableViewController {
    var dataArray: [String] = ["选项1", "选项2", "选项3"]
    // 定义闭包,参数是选中的单个数据
    var onItemSelected: ((String) -> Void)?
    
    // ... 其他代码
}

2. 单元格点击时调用闭包

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedItem = dataArray[indexPath.row]
    onItemSelected?(selectedItem)
    tableView.deselectRow(at: indexPath, animated: true)
    navigationController?.popViewController(animated: true)
}

3. 在DataAddedTableViewController中设置闭包

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let listVC = segue.destination as? ListTableViewController {
        listVC.onItemSelected = { [weak self] selectedItem in
            guard let self = self else { return }
            self.addedDataArray.append(selectedItem)
            self.tableView.reloadData()
        }
    }
}

关键注意点

  • 你之前的问题是用了按钮触发传值,导致传递整个数组,现在改成点击单元格触发,就能精准获取单个选中项了
  • 不管用代理还是闭包,都要确保在跳转时(比如prepare(for:sender:))正确设置代理或闭包
  • 如果你的数据不是String,记得把代码里的String替换成你的实际数据模型类(比如自定义的Item类)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:50:23