为每个部分选择单个单元格的问题
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
}
我正在尝试 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
试试这个:
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
}