从可见tableView中移出后,TableViewCell具有灰色背景

时间:2018-10-15 09:29:20

标签: ios swift uitableview

以下测试应用程序显示一个简单的tableView。原型单元的属性selectionStyle设置为default(灰色)。由于单元格多于可以显示的单元格,因此第一个单元格可见,而最后一个单元格则不可见。每个单元格的背景颜色设置为白色。

首次测试:
当选择一个单元格时,其背景变为灰色。 然后在委托函数中,将其isSelected属性设置为false,因此单元格背景再次变为白色。然后将单元格移至第0行,并相应地更新数据源。 这可以按预期工作。

第二项测试
向上滚动tableView,以便最后一个单元格可见。 现在选择一个单元格时,它将再次移至第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:)。然后,移动的单元格没有灰色背景。但是在这种情况下,该动作没有动画,因为我在开发中的应用中需要它。
如果将原型单元格的属性selectionStyle设置为none,则移动的单元格既没有灰色背景,也没有可见的选择反馈。

2 个答案:

答案 0 :(得分:1)

而不是设置isSelected属性,而是调用UITableView的deselectRow(at:animated:)方法:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    ...
}

答案 1 :(得分:0)

我向Apple提交了错误报告,并收到以下答复:

  

通常应该始终使用deselectRow(at:animated :)方法   在UITableView上取消选择一行。如果仅更改选定的   当前直接针对该行显示的UITableViewCell上的属性,   表格视图不会意识到这一点,并且当一个新的单元格是   在滚动期间重复使用同一行时,表视图将重置   单元格的选定状态以匹配是否认为该行是   已选择。表格视图的状态始终是真理的源泉;的   单元状态仅仅是当前的视觉表示   特定行。

很高兴知道!