我有一个带有按钮的tableview,可以增加和减少contentView的单个单元格的高度。单个单元格有很多配置不会持久化。(最终解决方案肯定包括持久化数据,但还有其他问题)我希望能够单击任何单元格中的按钮,拥有单元格扩展推送其他单元格,让所有单元格保持其配置数据。
如果我只使用reloadData,那么我必须坚持一切,并在我只编辑一个单元格时进行大量不必要的重新处理。最后,没有任何免费动画可以扩展或缩小。
这导致表视图更新和单元重新加载,它们带有动画和更少的开销。我可以调用UITableView.beginUpdates和UITableView.endUpdates。或者更理想的是,我只是在编辑单元格之后为可见单元格调用reloadRowsAtIndexPaths。在这种情况下,这将为高度变化设置动画,同时保持当前单元格数据的最新状态。但这不起作用。
最后,这是问题所在。 UITableView.beginUpdates,UITableView.endUpdates和reloadRowsAtIndexPaths使表视图滚动。这意味着如果您尝试更改高度的单元格具有足够高的indexPath,它将被出列并重复使用。我的所有配置数据都被丢弃了,而且我在屏幕上移动的单元格完全被回收。 (我在prepareForReuse期间通过在单元格上设置随机背景颜色来发现这一点。)
现在你要说的是,这很简单,只需禁用隐式动画,并强制重置tableview的底层scrollview的contentOffset,如下所示:
UIView.setAnimationsEnabled(false)
let contentOffset = tableView.contentOffset
tableView.beginUpdates()
tableView.endUpdates()
tableView.setContentOffset(contentOffset, animated: false)
UIView.setAnimationsEnabled(true)
在引擎盖下,内容偏移更改已完全处理,我的单元格仍然可以回收。反过来这个回收利用吗?