重新排序 TableView 和节标题高度变为零时数据源不更新

Posted

技术标签:

【中文标题】重新排序 TableView 和节标题高度变为零时数据源不更新【英文标题】:Data Source Doesn't Update when Reordering TableView and Section Header Height becomes Zero 【发布时间】:2019-09-11 19:37:43 【问题描述】:

当我重新排序我的 tableViewCells 时会发生一些问题,它们一直存在,直到我离开视图并返回,可能是因为调用了 tableView.reloadData()。 我有一个用于存储 Person 实例的 Persons(结构)数组(people)。当我重新排序我的单元格时,数据源不会更新,尽管我在 moveRowAt 中添加了代码。单元格似乎已重新排序,但 Person 实例中的变量没有更改。 这是我用来更改人员数组中人员的顺序并更新人员数组的代码。

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) 
    let movedPerson = people[sourceIndexPath.section]
    people.remove(at: sourceIndexPath.section)
    people.insert(movedPerson, at: destinationIndexPath.section)

当我对单元格重新排序时发生的另一个问题是 tableView 部分标题高度变为 0。这是设置我的 tableView 部分标题高度的代码。我的每个 tableView 单元格都是一个部分。我这样做是为了让它们之间有垂直间距。

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
    return 5

如果我将tableView.reloadData 放在 moveRowAt 函数中,这些问题不会发生,但我不想每次重新排序时都调用 reloadData,因为动画不流畅,并且有轻微的明显滞后.

【问题讨论】:

【参考方案1】:

我认为问题在于您正在使用以下部分:

people[sourceIndexPath.section]
people.remove(at: sourceIndexPath.section)
people.insert(movedPerson, at: destinationIndexPath.section)

而不是索引路径中的行:

people[sourceIndexPath.row] 
people.remove(at: sourceIndexPath.row)
people.insert(movedPerson, at: destinationIndexPath.row)

在其他地方也是如此。

【讨论】:

对不起,我没有说清楚。我的每个 tableView 单元格都是一个部分。我这样做了,所以它们之间可能存在垂直间距。

以上是关于重新排序 TableView 和节标题高度变为零时数据源不更新的主要内容,如果未能解决你的问题,请参考以下文章

启用排序时,JavaFX Tableview标题颜色

如何自定义 UITableView 的标题背景颜色、高度和文本?

在编辑模式下重新排序时更改 UITableViewCell 的背景颜色

TableView 单元格高度不根据第一次重新加载时的 collectionview 高度

vis studio 2008中的c ++调试,当变量变为零时如何中断

在 reloadSections 后 TableView 部分变为隐藏