我在tableView中有2个部分,并且multiSelection为true。 如果我在第一部分中选择第一个单元格,然后向下滚动,则第二个部分的第一个单元格已经被选中,并且在一些随机滚动中被随机播放。
此外,我没有在cellForRowAt中编写任何代码来标记checkmark
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
答案 0 :(得分:1)
我假设您使用dequeueReusableCell(withIdentifier:)
将您的单元格放入cellForRow(at:)
假设您最初在TableView中有10个可见的单元格。如果现在向上滚动,并为下一个单元格调用cellForRow(at:)
,则会创建一个新单元格(因为循环池为空)并添加到TableView的底部。一旦顶部的单元格从屏幕上消失,它将被添加到循环池中。如果您知道进一步向上滚动,则再次调用cellForRow(at:)
并调用ti dequeueReusableCell(withIdentifier:)
。但现在不是创建新的单元格,而是将下一个单元格从循环池中取出,并将此单元格添加到底部。
如果不更改属性的值,则会在将值添加到回收池之前保留这些值。
您应该将单元格重置为prepareForReuse()
子类UITableViewCell
中的默认值,或者检查并设置cellForRow(at:)
答案 1 :(得分:0)
您可以尝试新的UITableViewCell
类,例如添加一个新变量
var isSelect: Bool = false
。
您可以在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
判断isSelect
的值进行相应的显示处理,当您选择tableView时,更改此单元格isSelect
和reloadData()
。抱歉,我的英语不好,表达可能不太清楚。
答案 2 :(得分:0)
单元格将由tableview重用。您应该使用数组模型或字典模型来标记选定的状态。像这样:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedArray[indexPath.row] = true
tableView.reload()
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
selectedArray[indexPath.row] = false
tableView.reload()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//init cell
let selected = selectedArray[indexPath.row]
cell.accessoryType = selected ? .checkmark : .none
}