我有一个包含多个部分的tableview,每个部分都有3个单元格,每个单元格都包含自定义复选标记按钮。用户可以在点击时更改选中并取消选中复选按钮的图像。 问题是,我正在取消选中单元格按钮图像以检查用户单击按钮时工作正常。如果我滚动表格视图,复选标记图像正在添加到错误的单元格。
我用Google搜索并找到解决方案,例如在数组中保存单击的单元格indexPath.row,如果用户再次在同一单元格上单击,则从数组中删除。 它不起作用,因为我有多个部分。
请提供任何建议,找出解决问题的方法。
// Button action.
func buttonTappedOnCell(cell: customeCell) {
let indexPath : IndexPath = self.tableView.indexPath(for: cell)!
if self.selectedIndexPath.count > 0 {
for selectedIndex in self.selectedIndexPath {
if selectedIndex as! IndexPath == indexPath {
self.selectedIndexPath.remove(indexPath)
} else {
self.selectedIndexPath.add(indexPath)
}
}
} else {
self.selectedIndexPath.add(indexPath)
}
cellForRowAtIndexPath中的代码
for anIndex in self.selectedIndexPath {
if anIndex as! IndexPath == indexPath {
cell.checkMarkButton.setBackgroundImage(UIImage(named: "checkMark"), for: .normal)
} else {
cell.checkMarkButton.setBackgroundImage(UIImage(named: "UnCheckMark"), for: .normal)
}
}
答案 0 :(得分:3)
使用Set<IndexPath>
可以大大简化代码。无需循环遍历数组。
var selectedPaths=Set<IndexPath>()
func buttonTappedOnCell(cell: customeCell) {
if let indexPath = self.tableView.indexPath(for: cell) {
var image = UIImage(named: "CheckMark")
if self.selectedPaths.contains(indexPath) {
image = UIImage(named: "UnCheckMark")
self.selectedPaths.remove(indexPath)
} else {
self.selectedPaths.insert(indexPath)
}
cell.checkMarkButton.setBackgroundImage(image, for: .normal)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! YourCellType
...
var image = UIImage(named: "UnCheckMark")
if self.selectedPaths.contains(indexPath) {
image = UIImage(named: "checkMark")
}
cell.checkMarkButton.setBackgroundImage(image, for: .normal)
return cell
}
答案 1 :(得分:1)
这是因为tableView的单元格被重用以最小化内存使用。
如果您使用custom implementation
check button
,则必须存储data Structure like an array
中所选单元格的值,例如,如果您有2个部分,其中包含3个元素每个部分选中第一部分第二项,然后像数组一样的数据结构可以像[[false, true, false], [false, false. false]]
。
在这里,如果选择了单元格,我将设置为true。更新此数据结构的值,并在cellForRowAt
中应用映像时检查它,并仅在index的indexPath.section和indexPath.row返回true
Bool时应用checkedImage。
希望这会有所帮助。如有任何疑问,请随时联系。快乐的编码。
答案 2 :(得分:-2)
在你的TableView DidSelect方法中放入
let cell = tableView.cellForRowAtIndex(indexPath).accessoryType = UITableViewCell.accessoryType = Checkmark
对于DidDeselect方法,反之亦然,但将Checkmark更改为None。
let cell = tableView.cellForRowAtIndex(indexPath).accessoryType = UITableViewCell.accessoryType = None
如果为简单方法创建更复杂的代码,它会给你带来灾难。