当我向下滚动表格视图时,隐藏单元格的复选标记消失了
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
当我向下滚动并随后向上滚动时,复选标记在视图中,即使它们必须不可见以上是关于当我向下滚动表格视图时,隐藏单元格的复选标记消失了的主要内容,如果未能解决你的问题,请参考以下文章