代码之家  ›  专栏  ›  技术社区  ›  Reinhard Männer

TableViewCell在移出可见的tableView后具有灰色背景

  •  1
  • Reinhard Männer  · 技术社区  · 6 年前

    selectionStyle 原型单元的 default (灰色)。由于单元格的数量超出了显示范围,因此第一个单元格可见,最后一个单元格不可见。每个单元格的背景色设置为白色。

    第一次测试:
    当选定其中一个单元格时,其背景将变为灰色。 isSelected 属性设置为 false 这和预期的一样。


    表格视图向上滚动,以便最后的单元格可见。 现在选定单元格后,它将再次移动到第0行,该行已移出tableView的可见区域。这又起作用了。然而:
    如果随后向下滚动tableView,使第0行再次可见, 移动的单元格现在有一个灰色背景,就好像它被选中一样

    enter image description here

    这是我的密码:

    import UIKit
    
    class ViewController: UIViewController {
        @IBOutlet weak var tableView: UITableView!
        var tableData = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", 
                         "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"]
    }
    
    extension ViewController: UITableViewDataSource {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return tableData.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell")!
            let row = indexPath.row
            cell.textLabel?.text = tableData[row]
            cell.backgroundColor = .white
            return cell
        }
    }
    
    extension ViewController: UITableViewDelegate {
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let selectedCell = tableView.cellForRow(at: indexPath)!
            selectedCell.isSelected = false
    
            let sourceRow = indexPath.row
            let destinationRow = 0
    
            let removedElement = tableData.remove(at: sourceRow)
            tableData.insert(removedElement, at: 0)
    
            let destinationIndexPath = IndexPath.init(row: destinationRow, section: 0)
            tableView.moveRow(at: indexPath, to: destinationIndexPath)
        }
    }
    

    我的问题是:
    我的密码有问题吗?
    或者这是一个iOS错误?如果有,有解决办法吗?

    请注意:
    当然可以使用 tableView.reloadData() tableView.moveRow(at:, to:) . 然后,移动的单元格没有灰色背景。但在本例中,这个动作并没有动画效果,因为我需要在正在开发的应用程序中使用它。
    If属性 选择样式 原型单元的 none

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ilya Kharabet    6 年前

    而不是设置 isSelected deselectRow(at:animated:) UITableView方法:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        ...
    }
    
        2
  •  0
  •   Reinhard Männer    6 年前

    我向苹果提交了一份bug报告,得到了以下答案:

    在UITableView上取消选择行。如果只更改选定的 表视图将不会意识到这一点,并且在创建新单元格时 在滚动期间重复使用同一行,表视图将重置 单元格的选定状态,以匹配它是否认为行是 挑选出来的。表视图状态总是真理的源泉;这个 特定行。

    很高兴知道!