当我向下滚动表格视图时,隐藏单元格的复选标记消失了

Posted

技术标签:

【中文标题】当我向下滚动表格视图时,隐藏单元格的复选标记消失了【英文标题】:when i scroll down the tableview the checkmarks of the hidden cells disappear 【发布时间】:2019-09-07 13:40:19 【问题描述】:

滚动前启用复选标记的单元格:

我向上滚动后带有禁用复选标记的单元格:

嘿伙计们,我创建了一个表格视图和一个添加按钮来添加新单元格。当我添加单元格并启用UITableViewCell.AccessoryType.checkmark 时,当我滚动表格视图并且单元格从视图中消失时,复选标记就会消失。 我该如何解决?

   var waterValue = [String]()


    @IBAction func addButtonPressed(_ sender: Any) 




        let alert = UIAlertController(title: "add your amount of water for today", message: nil, preferredStyle: .alert)
        alert.addTextField(configurationHandler: (waterAmountTodayTF) in waterAmountTodayTF.placeholder = "enter L for today")
        alert.textFields?.first?.textAlignment = .center
        alert.textFields?.first?.becomeFirstResponder()
        alert.textFields?.first?.keyboardType = UIKeyboardType.decimalPad


        let action = UIAlertAction(title: "add", style: .default) 
            (_) in
            guard let waterAmountForToday = (alert.textFields?.first?.text) else  return 
            self.add("\(waterAmountForToday) L")
//            print(self.sliderValue)
        
        alert.addAction(action)
        present(alert, animated: true)
    



    func add(_ individualWaterAmount: String) 
        let index = 0
        waterValue.insert(individualWaterAmount, at: index)
        let indexPath = IndexPath(row: index, section: 0)
        tableView.insertRows(at: [indexPath], with: .left)
    



    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 70.0
    



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
       return waterValue.count
    



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell()
        let individualWaterValues = waterValue[indexPath.row]
        cell.textLabel?.text = individualWaterValues
        cell.textLabel?.textAlignment = .right
        cell.selectionStyle = .none
        return cell
    



    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark 
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
         else 
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
        
    



    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        guard editingStyle == .delete else  return 
        waterValue.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)
    

【问题讨论】:

首先,让您的表格视图重用单元格,而不是一直分配新的单元格。其次,不要将数据存储在 UI 组件中,为此使用您的模型对象。 所以我应该使用 dequereusablecell 而不是 UITableViewCell() ? 是的,并且还让您的waterValue 成为一个结构数组,用于存储您的字符串和“选定”值。 “不要将数据存储在 UI 组件中”是什么意思?你是说 UIbutton 吗? 您的代码现在将所选状态“存储”在每个单元格的accessoryType 中。这是一个糟糕的设计,尤其是当您没有像表格条目那么多的单元格时。就像我在之前的评论中所说的那样,将这些信息存储在其他地方。通常最好有一个结构来存储与表格单元格相关的所有数据,并将这些结构的数组用作表格的数据源。 【参考方案1】:

在创建新单元格时,您尚未添加逻辑以将附件类型设置为复选标记。

您需要做的是,保存您选择的值,然后在创建新单元格时使用该值。

var selectedIndexes: [Int] = []; //global variable
...
...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell()
        let individualWaterValues = waterValue[indexPath.row]
        cell.textLabel?.text = individualWaterValues
        cell.textLabel?.textAlignment = .right
        cell.accessoryType = selectedIndexes.contains(indexPath.row) ? UITableViewCell.AccessoryType.checkmark : UITableViewCell.AccessoryType.none
        return cell
    


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark 
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
           selectedIndexes.removeAll(where:  $0 == indexPath.row  )
         else 
           tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
           selectedIndexes.append(indexPath.row)
        
    

【讨论】:

它给了我一个关于“?”的错误。在cell.selectionStyle = selectedIndexes.contains(indexPath.row) ? UITableViewCell.AccessoryType.checkmark : UITableViewCell.AccessoryType.none 查看更新的答案。我错过了在 cellForRow 方法中放置cell.accessoryType 当我向下滚动并随后向上滚动时,复选标记在视图中,即使它们必须不可见

以上是关于当我向下滚动表格视图时,隐藏单元格的复选标记消失了的主要内容,如果未能解决你的问题,请参考以下文章

滚动时重复 TableView 上的复选标记

带有自定义表格视图单元格的表格视图在滚动时消失

tableview 编辑模式单元格选择复选标记在滚动时消失

滚动时隐藏自定义表格视图单元格标签如何解决?

tableView上的复选标记[重复]

如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?