重新排序 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 和节标题高度变为零时数据源不更新的主要内容,如果未能解决你的问题,请参考以下文章
如何自定义 UITableView 的标题背景颜色、高度和文本?
在编辑模式下重新排序时更改 UITableViewCell 的背景颜色
TableView 单元格高度不根据第一次重新加载时的 collectionview 高度