Swift:配件有问题
Swift: Trouble with Accessories
在我的项目中,我只是添加了这行代码,以便在用户 select 的单元格旁边添加一个小复选标记。 (在 select 行函数中)
let currentCell = tblView.cellForRow(at: indexPath)! as UITableViewCell
currentCell.accessoryType = .checkmark
currentCell 打印正常。例如,当我打印出单元格时,它会给我单元格的框架;文本;剪辑到边界;自动调整大小; layer:0>。当我添加这行代码时,正如预期的那样,它确实在该单元格上添加了复选标记,但也从该单元格开始每隔 15 个单元格添加了复选标记 - 它看起来像这样
有谁知道为什么会这样,我该如何解决?
这不是您使用 table 视图的方式。
Table 视图单元格被重复使用。复选标记出现在您没有点击的单元格上,因为它实际上与您 确实 点击的单元格是相同的 UITableViewCell
对象,但由于该单元格已被滚出看来,它又重新显示在底部,只是带有不同的标签文本。
didSelectRow
中正确的做法是更新您的模型。现在,您可能正在使用一个数组作为 table 视图的数据源:
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
在我的项目中,我只是添加了这行代码,以便在用户 select 的单元格旁边添加一个小复选标记。 (在 select 行函数中)
let currentCell = tblView.cellForRow(at: indexPath)! as UITableViewCell
currentCell.accessoryType = .checkmark
currentCell 打印正常。例如,当我打印出单元格时,它会给我单元格的框架;文本;剪辑到边界;自动调整大小; layer:0>。当我添加这行代码时,正如预期的那样,它确实在该单元格上添加了复选标记,但也从该单元格开始每隔 15 个单元格添加了复选标记 - 它看起来像这样
有谁知道为什么会这样,我该如何解决?
这不是您使用 table 视图的方式。
Table 视图单元格被重复使用。复选标记出现在您没有点击的单元格上,因为它实际上与您 确实 点击的单元格是相同的 UITableViewCell
对象,但由于该单元格已被滚出看来,它又重新显示在底部,只是带有不同的标签文本。
didSelectRow
中正确的做法是更新您的模型。现在,您可能正在使用一个数组作为 table 视图的数据源:
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