Swift - 处理表格视图多个部分的自定义复选标记按钮状态

Posted

技术标签:

【中文标题】Swift - 处理表格视图多个部分的自定义复选标记按钮状态【英文标题】:Swift - Handling custom checkmark button state on multiple sections of tableview 【发布时间】:2017-04-17 06:23:12 【问题描述】:

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

我用谷歌搜索并找到了解决方案,例如将单击的单元格 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)
        
    

【问题讨论】:

您能否在表格中为自定义单元格设置属性的位置显示您的代码 也许使用 Eureka 表单? 您需要将indexPath 保存在数组中,而不仅仅是行(或者更好的是,使用Set<IndexPath> 而不是数组) @LazyCoder 检查该方法在表格自定义类中的使用-:***.com/questions/9362713/… @Paulw11 用代码更新了问题,我已经按照你的建议做。但我仍然面临问题 【参考方案1】:

您可以使用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

【讨论】:

感谢您的快速回复。它工作得很好,需要对您的答案进行小的修正,如果条件.if self.selectedPaths.contains(indexPath) 因为如果 NSSet 包含 indexPath 我们需要取消选中复选标记跨度> 对不起。我弄错了。我会更新的。 @objc func checkBoxTapped(cell : CheckboxCell) if let indexPath = self.tableView.indexPath(for: cell) as CheckboxCell // 无法强制将 indexpath 类型的值转换为 checkboxcell 类型错误,有什么想法吗? indexPath(for:) 返回 IndexPath 而不是 UITableViewCell,因此您的向下转型无效。 抱歉,打错了。那里没有必要沮丧。【参考方案2】:

这是因为 tableView 的单元被重用以最小化内存使用。

如果您使用的是custom implementationcheck button,那么您必须存储在data Structure like an array 中选择的单元格的值,例如,如果您有2 个部分,每个部分中有3 个元素,并且 选中第 1 节中的第 2 项,则像数组这样的数据结构可以像 [[false, true, false], [false, false. false]]。 在这里,如果选择了单元格,我将设置为 true。更新此数据结构的值并在应用 cellForRowAt 中的图像时对其进行检查,并仅在数组的 indexPath.section 和 indexPath.row 返回 true 布尔值时应用 checkedImage。

希望这会有所帮助。如有任何疑问,请随时与我们联系。编码愉快。

【讨论】:

Ibrhim 感谢您的建议,paulw11 的回答也很好【参考方案3】:

在您的 TableView DidSelect 方法中放置

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

对于 DidDeselect 方法反之亦然,但将 Checkmark 更改为 None。

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

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

【讨论】:

以上是关于Swift - 处理表格视图多个部分的自定义复选标记按钮状态的主要内容,如果未能解决你的问题,请参考以下文章

表格内容在使用子视图的自定义单元格的 TableView 滚动上消失 - Swift

如何在swift ios中将多个图像添加到自定义表格视图单元格?

UIButton 状态在滚动带有多个部分的 tableview 时发生变化 - Swift

UITableViewCell Swift 中的自定义视图

以swift语言在自定义表格视图单元格中更新进度视图下载

从 Swift 中的自定义数据单元开始