【问题标题】:How to display multiple selected rows in a custom table view cell in the next screen如何在下一个屏幕的自定义表格视图单元格中显示多个选定的行
【发布时间】:2026-01-24 03:05:02
【问题描述】:

我创建了一个表格视图并添加了一个自定义表格视图单元格。在自定义表格视图单元格中,我添加了 4 个标签并在每个标签上传递了一个数组。我还启用了多行选择。我想将选定的行传递到下一个屏幕并在那里显示。

【问题讨论】:

  • 您希望将所选单元格的哪一部分传递到下一个屏幕? indexPath,标签,还是别的什么?您如何转到具有多个选定单元格的下一个屏幕?
  • selected 信息添加到您的数据模型中。然后将所有带有selected == true 的项目传递给下一个控制器。
  • func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { for (index, element) in amountSelected.enumerated() { if element == invoice[indexPath.row] { amountSelected.remove(在:索引)}}打印(amountSelected)}
  • 在控制器和按钮点击代码中首先声明 amountSelected,您可以在下面的答案中看到 @IBAction func doneClick(_ sender: Any) { }。我在下一个屏幕中声明 tableViewSelectedRow。希望对你有所帮助。

标签: ios swift


【解决方案1】:

当你选择行时,每次UITableViewdidSelect 调用,这样你就可以为 selectedRow 的存储值创建数组,如果已经在数组中而不是删除行。

selectedRow 数组,您可以在下一个屏幕中使用它。

对于删除按钮,我使用mk_addTapHandler Button Extention you can see here

在我的项目中同样的问题,但根据我的设计,我在单元格上放了一个按钮进行删除,我解决了,所以 您可以使用以下代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellDemo", for: indexPath)
    cell.textLabel?.text = "\(indexPath.row)"

    cell.btnDelete.mk_addTapHandler { (btn)
        for (i,objValue) in selectedRow.enumerated() {
            if indexPath.row == objValue {
                self.selectedRow.remove(at: i)
                for (i,objValue) in selectedRow.enumerated() {
                    if indexPath.row < objValue {
                        selectedRow[i] = objValue - 1
                    }else {
                        selectedRow[i] = objValue + 1
                    }
                }
            }
        }
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  selectedRow.append(indexPath.row)
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
   for (index, element) in selectedRow.enumerated() {
      if indexPath.row == element {
        selectedRow.remove(at: index)
      }
   }
}

@IBAction func doneClick(_ sender: Any) {
  if let VC = self.storyboard?.instantiateViewController(withIdentifier: "nextScreen") as! nextScreen
    VC.tableViewSelectedRow = selectedRow   
    self.navigationController?.pushViewController(VC, animated: true) 
  }
}

【讨论】:

  • 请注意,如果可以插入或删除单元格,此解决方案将导致问题。
  • 是的@vadian,但是当你删除时,请从数组中删除行,当你首先插入单元格时,比为所有数组值增加 +1
  • 这还不够。如果您删除索引 2 处的单元格,所有索引路径 > 2 都会更改,这会使您的索引数组无效。
  • 我解决了我的代码中的问题并编辑答案,现在你可以试试 - 谢谢
  • 对不起,这样很麻烦,效率很低。
【解决方案2】:

如果您已经在 tableView 中启用了多行选择,则相对简单。在您的按钮操作方法中获取所选行的 indexPaths,然后使用它们从数据源中提取数据并将它们注入下一个 viewController。下面为您提供了核心功能,但由于您没有共享数据源或表格设计的代码,或者表明您是使用 IB 还是应用程序代码,您必须使其适合您的环境。

假设:

  • 你有一个简单的 tableView,只有一个部分,所有行都是下一个 VC 的可能数据
  • 您正在编写代码中的 UI,并且想要推送而不是展示下一个 VC
  • 您的视图数据位于名为mainData 的数组中
  • 您的下一个视图控制器是一个名为NextViewController 的类
@objc doneButtonTapped(_ sender: UIButton) {
   let indexPaths = tableView.indexPathsForSelectedRows
   let selectedData = indexPaths.map{mainData[indexPath.row]}
   let nextVC = NextViewController() 
   nextVC.data = selectedData
   navigationController?.pushViewController(nextVC, animated: true)
}

【讨论】:

    最近更新 更多