TableView AccessoryType Checkmark随机播放

时间:2017-05-17 18:01:58

标签: ios swift uitableview

我在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
}

3 个答案:

答案 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时,更改此单元格isSelectreloadData() 。抱歉,我的英语不好,表达可能不太清楚。

答案 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
}