【问题标题】:Swift: Trouble with Accessories斯威夫特:配件问题
【发布时间】:2020-05-21 21:25:49
【问题描述】:

在我的项目中,我只是添加了这行代码,以便在用户选择的单元格旁边添加一个小复选标记。 (在函数中选择行)

    let currentCell = tblView.cellForRow(at: indexPath)! as UITableViewCell
    currentCell.accessoryType = .checkmark

currentCell 打印正常。例如,当我打印出单元格时,它给了我单元格的框架;文本;剪辑到边界;自动调整大小;层:0>。当我添加这行代码时,正如预期的那样,它确实在该单元格上添加了复选标记,而且每隔 15 个单元格也添加了复选标记,从该单元格开始 - 它看起来像这样

有谁知道为什么会这样,我该如何解决这个问题?

【问题讨论】:

  • 您是要勾选多行还是只勾选一行?最好使用您的模型或其他属性来存储是否选择了某个或多个单元格并将复选标记设置为cellForRowAt,而不是didSelectRowAt。您当前遇到的问题是由于细胞重复使用造成的。

标签: ios swift selection checkmark


【解决方案1】:

这不是你使用表格视图的方式。

重复使用表格视图单元格。复选标记出现在您未点击的单元格上,因为实际上与您点击的单元格相同的UITableViewCell 对象,但由于该单元格已被滚动出视图,因此它是在底部再次重新显示,只是带有不同的标签文本。

didSelectRow 中正确的做法是更新你的模型。现在,您可能正在使用一系列事物作为表格视图的数据源:

var listOfThings: [MyModel]!

现在你只需要以某种方式存储哪些东西被选中,哪些不在你的模型中。例如。在另一个数组中:

var thingsSelectionStatuses: [Bool]!

像这样初始化它:

thingsSelectionStatuses = Array(repeating: false, count: listOfThings.count)

didSelectRow 中,更新thingsSelectionStatuses 并重新加载单元格。

thingsSelectionStatuses[indexPath.row].toggle()
tableView.reloadRows(at: [indexPath], with: .automatic)

重新加载单元格将导致调用cellForRowAt。在cellForRowAt 中,我们根据thingsSelectionStatuses 设置accessoryType

cell.accessoryType = thingsSelectionStatuses[indexPath.row] ? .checkmark : .none

【讨论】:

  • 如何在不取消选择的情况下将这些单元格重置为 .none,例如,当用户单击一个单元格然后返回时 - 如何将所有这些单元格重置为 .none
  • @rarora25 同样,您应该更新模型。例如,执行thingsSelectionStatuses = Array(repeating: false, count: listOfThings.count) 然后tableView.reloadData() 重新加载所有单元格。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 2015-08-02
  • 2018-02-10
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 2016-02-08
相关资源
最近更新 更多