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
相关产品推荐
相关产品推荐

