为每个部分选择单个单元格的问题

Issue with selecting single cell for each section

我正在尝试 select 每个部分一个单元格。一切正常,但是当我将 tableview 滚动到底部或顶部时,复选标记附件出现在随机单元格上。这是代码:

tableView.allowsMultipleSelection = true

    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
          // Find any selected row in this section
          if let selectedIndexPath = tableView.indexPathsForSelectedRows?.first(where: { [=10=].section == indexPath.section}) {
              // Deselect the row
              tableView.deselectRow(at: selectedIndexPath, animated: false)
              // deselectRow doesn't fire the delegate method so need to
              // unset the checkmark here
              tableView.cellForRow(at: selectedIndexPath)?.accessoryType = .none
          }
          return indexPath
      }

       func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? {
          // Prevent deselection of a cell
          return nil
      }

       func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
      }
   

如能提供帮助,我们将不胜感激

发生这种情况是因为您正在对屏幕上的单元格进行更改,而没有更新您的模型以反映这些更改。然后,当一个单元格被回收时,有时您会选择一个仍然设置了复选标记的单元格。

不要进入细胞并改变它们的外观。相反,将单元格标记为需要更新(通过调用 reloadRows(at:with)),然后在您的 tableView(cellForRowAt:) 方法中,始终将附件类型设置为 .none.checkmark

发生这种情况是因为细胞是可重复使用的。我认为在didSelectRowAt中调用tableView.cellForRow不是一个好主意。你必须控制在cellForRowAt

中选择哪个indexPath

试试这个:

 var selectedRows = [IndexPath]() // selected indexPaths array
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if selectedRows.contains(indexPath){ // if already selected , remove
        selectedRows = selectedRows.filter({[=10=] != indexPath})
    }else{
        selectedRows.append(indexPath)
    }
    tableView.reloadRows(at: [indexPath], with: .automatic)
  }

在你的cellForRowAt

  if selectedRows.contains(indexPath){
        cell.accessoryType = .checkmark
    }else{
        cell.accessoryType = .none
    }