Swift 5 | didSelectRowAt 同时选择两个单元格
Swift 5 | didSelectRowAt is selecting two cells at the same time
我正在做一个屏幕,其中有一个带有开关的单元格列表,如下图所示;
我有一个结构,其中保存单元格的标签和开关状态值。此结构加载于:var source: [StructName] = []
,然后源值归因于 UITableView 单元格。
问题是,当触摸一个单元格时,函数:func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
更改多个单元格同时切换状态。
我尝试通过实现以下功能来解决该问题:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
for n in 0..<source.count{ // This loop search for the right cell by looking at the cell label text and the struct where the state of the switch is saved
if cell.label.text! == source[n].Label{
// If the label text is equal to the position where the values is saved (is the same order that the cells are loaded in the UITableView) then a change the state of the switch
let indexLabel = IndexPath(row: n, section: 0)
let cellValues = tableView.cellForRow(at: indexLabel) as! CustomTableViewCell
if cellValues.switchButton.isOn {
cellValues.switchButton.setOn(false, animated: true)
source[n].valor = cellValues.switchButton.isOn
} else {
cellValues.switchButton.setOn(true, animated: true)
source[n].valor = cellValues.switchButton.isOn
}
break
}
}
虽然将正确的值保存到开关状态数组(来源),但多个开关的视觉状态也会发生变化,即使单元格从未接触过。
如何将我的代码更改为 select 并仅更改 触摸的单元格?
您不应在单元格中存储/读取任何内容的状态。
但首先要做的是:
- 为什么要遍历所有值?您应该能够通过
indexPath.row
直接访问数据模型中的行
- 您应该只修改模型数据,而不是单元格
- 然后告诉 table 视图重新加载单元格,然后它会要求模型显示正确的数据。
我建议如下:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let row = indexPath.row
source[row].valor.toggle()
tableView.reloadRows(at:[indexPath], with:.automatic)
}
我正在做一个屏幕,其中有一个带有开关的单元格列表,如下图所示;
我有一个结构,其中保存单元格的标签和开关状态值。此结构加载于:var source: [StructName] = []
,然后源值归因于 UITableView 单元格。
问题是,当触摸一个单元格时,函数:func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
更改多个单元格同时切换状态。
我尝试通过实现以下功能来解决该问题:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
for n in 0..<source.count{ // This loop search for the right cell by looking at the cell label text and the struct where the state of the switch is saved
if cell.label.text! == source[n].Label{
// If the label text is equal to the position where the values is saved (is the same order that the cells are loaded in the UITableView) then a change the state of the switch
let indexLabel = IndexPath(row: n, section: 0)
let cellValues = tableView.cellForRow(at: indexLabel) as! CustomTableViewCell
if cellValues.switchButton.isOn {
cellValues.switchButton.setOn(false, animated: true)
source[n].valor = cellValues.switchButton.isOn
} else {
cellValues.switchButton.setOn(true, animated: true)
source[n].valor = cellValues.switchButton.isOn
}
break
}
}
虽然将正确的值保存到开关状态数组(来源),但多个开关的视觉状态也会发生变化,即使单元格从未接触过。
如何将我的代码更改为 select 并仅更改 触摸的单元格?
您不应在单元格中存储/读取任何内容的状态。 但首先要做的是:
- 为什么要遍历所有值?您应该能够通过
indexPath.row
直接访问数据模型中的行
- 您应该只修改模型数据,而不是单元格
- 然后告诉 table 视图重新加载单元格,然后它会要求模型显示正确的数据。
我建议如下:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let row = indexPath.row
source[row].valor.toggle()
tableView.reloadRows(at:[indexPath], with:.automatic)
}