我的tableView中有两个部分,multipleSelection为真。如果我选择了第一部分中的第一个单元格,然后向下滚动,那么第二部分的第一个单元格就已经被选中了,并且在某个随机滚动中被打乱了。
另外,我没有任何用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
}发布于 2017-05-18 03:11:27
我假设您使用dequeueReusableCell(withIdentifier:)在cellForRow(at:)中获取单元格,假设最初TableView中有10个可见单元格。如果现在向上滚动,并为下一个单元格调用cellForRow(at:),则会创建一个新单元格(因为回收池为空),并将其添加到TableView的底部。一旦顶部的单元格从屏幕上消失,它将被添加到回收池中。如果你知道再往上滚动,那么就会再次调用cellForRow(at:),并且在ti的一侧调用dequeueReusableCell(withIdentifier:)。但现在不是创建一个新的单元,而是将下一个单元从回收池中取出,并将该单元添加到底部。如果您不更改属性的值,它将保留将其添加到回收池之前的值。您应该将UITableViewCell子类的prepareForReuse()中的单元格重置为默认值,或者选中并设置cellForRow(at:)中的所有值
发布于 2017-05-18 10:54:36
您可以尝试新的UITableViewCell类,添加一个新的变量,例如var isSelect: Bool = false。你可以在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell判断isSelect的值做相应的显示处理,当你选择tableView时,修改这个单元格的isSelect和reloadData()。对不起,我的英语不好,表达可能不清楚。
发布于 2017-05-18 11:07:54
将被tableview.You重用的单元格应该使用数组模型或字典模型来标记选定的状态。如下所示:
 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
}https://stackoverflow.com/questions/44031923
复制相似问题