Ios Swift-在tableview的多个部分上处理自定义复选标记按钮状态

Ios Swift-在tableview的多个部分上处理自定义复选标记按钮状态,ios,iphone,swift3,Ios,Iphone,Swift3,我有一个具有多个部分的tableview,每个部分有3个单元格,每个单元格包含自定义复选标记按钮。在这里,用户可以在单击时更改选中和取消选中复选按钮的图像。 问题是,当用户点击按钮时,我将单元格按钮图像从取消选中改为选中,这样可以正常工作。如果我滚动tableview,复选标记图像添加到错误的单元格 我在谷歌上搜索了一下,找到了这样的解决方案:在数组中保存单击的单元格indexath.row,并在用户再次单击同一单元格时从数组中删除。 它不工作,因为我有多个部分 请给我任何建议,找出解决我问题的

我有一个具有多个部分的tableview,每个部分有3个单元格,每个单元格包含自定义复选标记按钮。在这里,用户可以在单击时更改选中和取消选中复选按钮的图像。 问题是,当用户点击按钮时,我将单元格按钮图像从取消选中改为选中,这样可以正常工作。如果我滚动tableview,复选标记图像添加到错误的单元格

我在谷歌上搜索了一下,找到了这样的解决方案:在数组中保存单击的单元格indexath.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)
        }
    }

在您的TableView中,刚才放置的DidSelect方法

let cell = tableView.cellForRowAtIndex(indexPath).accessoryType = UITableViewCell.accessoryType = Checkmark
反之亦然,但将复选标记更改为无

let cell = tableView.cellForRowAtIndex(indexPath).accessoryType = UITableViewCell.accessoryType = None

如果你为一个简单的方法创建了更复杂的代码,它会给你带来灾难。

这种情况的发生是因为tableView的单元格被重用,以最大限度地减少内存使用

如果您使用的是
检查按钮的
自定义实现
,则必须存储在
数据结构(如数组)中选择的单元格的值,例如,如果您有两个节,每个节中有3个元素,并且在第一节中选择了第二项,然后像数组一样的数据结构可以像
[[false,true,false],[false,false.false]]
。 在这里,如果选择了单元格,我将设置为true。更新此数据结构的值,并在应用
cellForRowAt
中的图像时从中进行检查,并且仅当数组的indexPath.section和indexPath.row返回
true
Bool时才应用检查图像


希望这有帮助。如果有任何疑问,请随时联系。愉快的编码。

您可以通过使用
集合大大简化代码。不需要在数组中循环

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
}
var selectedPaths=Set()
func按钮附加单元格(单元格:customeCell){
如果让indexPath=self.tableView.indexPath(for:cell){
var image=UIImage(名为“选中标记”)
如果self.selectedPaths.contains(indexPath){
image=UIImage(名为“取消选中标记”)
self.selectedPaths.remove(indexPath)
}否则{
self.selectedPaths.insert(indexPath)
}
cell.checkMarkButton.setBackgroundImage(图像,用于:。正常)
}
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让cell=tableView.dequeueReusableCell(带有标识符:“identifier”,for:indexPath)作为!YourCellType
...
var image=UIImage(名为“取消选中标记”)
如果self.selectedPaths.contains(indexPath){
image=UIImage(名为“选中标记”)
}
cell.checkMarkButton.setBackgroundImage(图像,用于:。正常)
返回单元
}

您可以在表中为自定义单元格设置属性的位置显示您的代码吗?也许可以使用Eureka表单?您需要将
indepath
保存在数组中,而不仅仅是行中(或者更好,使用
set
而不是数组)@LazyCoder检查这个方法在表custom class中的使用情况-:@Paulw11用代码更新了这个问题,我已经按照你的建议做了。但我仍然面临问题谢谢你的快速回复。它工作得很好,需要对您的答案进行一些小的更正,您需要在下面的if条件中将图像名称从复选标记更改为取消复选标记。if self.selectedPaths.contains(indexPath){因为如果NSSet包含indexPath,我们需要取消选中复选标记。对不起,我搞错了。我会更新它。@objc func checkbox(cell:CheckboxCell){如果让indexath=self.tableView.indexath(for:cell)作为CheckboxCell{}//在强制错误中无法将indexPath类型的值转换为CheckboxCell类型,有什么想法吗?
indexath(for:)
返回一个
indepath
而不是
UITableViewCell
,因此您的下拉列表无效。很抱歉,这是一个输入错误。不需要在那里进行下拉列表。谢谢您的建议,我的回答也很好