以下测试应用程序显示一个简单的tableView。原型单元的属性selectionStyle
设置为default
(灰色)。由于单元格多于可以显示的单元格,因此第一个单元格可见,而最后一个单元格则不可见。每个单元格的背景颜色设置为白色。
首次测试:
当选择一个单元格时,其背景变为灰色。
然后在委托函数中,将其isSelected
属性设置为false
,因此单元格背景再次变为白色。然后将单元格移至第0行,并相应地更新数据源。
这可以按预期工作。
第二项测试
向上滚动tableView,以便最后一个单元格可见。
现在选择一个单元格时,它将再次移至第0行,该行已移出tableView的可见区域。这再次起作用。但是:
如果然后向下滚动tableView以便再次显示第0行,则已移动的单元格现在具有灰色背景,就好像它已被选中,但不是这样。这不能按预期工作:
这是我的代码:
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
,则移动的单元格既没有灰色背景,也没有可见的选择反馈。
答案 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上的属性, 表格视图不会意识到这一点,并且当一个新的单元格是 在滚动期间重复使用同一行时,表视图将重置 单元格的选定状态以匹配是否认为该行是 已选择。表格视图的状态始终是真理的源泉;的 单元状态仅仅是当前的视觉表示 特定行。
很高兴知道!