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

时间:2017-04-17 06:23:12

标签: ios iphone swift3

我有一个包含多个部分的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)
        }
    }

3 个答案:

答案 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

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