行插入/删除后无法调整 TableView contentOffset

Posted

技术标签:

【中文标题】行插入/删除后无法调整 TableView contentOffset【英文标题】:Unable to Adjust TableView contentOffset after row insertion/deletion 【发布时间】:2021-06-25 10:34:59 【问题描述】:

插入行或删除行后设置 tableView contentOffset 时出现问题。

当我收到新数据时,我会更新数据源并在 tableView 顶部插入行(tableView 反转,即原点位于底部)。插入行后,有时我必须手动调整其 contentOffset 但第一次无法正常工作。

注意:插入新行时用户不会滚动表格视图

//插入部分

 self.tableView.insertRows(at: [IndexPath.init(row: index, section: 0)], with: .right)

//偏移调整部分

self.tableView.contentOffset = CGPoint.init(x: 0, y: 80)

偏移量无法正常工作。即使像上面那样调整了偏移量,tableview 也保持不变

【问题讨论】:

【参考方案1】:

为什么要设置偏移量?

如果您将内容偏移量设置为滚动到特定单元格,那么您绝对应该使用

tableView.scrollToRow(at: indexPath, at: .middle, animated: true)

可能的修复

如果您只是想将偏移量更改为静态值,例如 80,那么值得尝试使用 set content offset 方法,如下所示:

tableView.setContentOffset(CGPoint(x: 0, y: 80), animated: true)

解决此问题的另一种可能方法是尝试延迟内容偏移量更改,我不喜欢这种方法,因为它很老套,但无论如何值得一提,您可以像这样 dispatchQueue 调用:

DispatchQueue.main.async 
    tableView.contentOffset = CGPoint(x: 0, y: 80)

【讨论】:

嗨@Ayrton,感谢您的回复。其实我可以解释为什么我需要设置偏移量。正如我提到的,它是一个倒置的表格视图,因此第一行将位于底部。当用户长按第一行时,我需要在屏幕底部显示一个类似自定义视图的操作表,并且该行必须移动到类似视图的操作表上方。在这里我不能使用 tableView.scrollToRow(at: indexPath, at: .middle, animated: true) 因为 tableview 不会将第一行滚动到中间。因此添加额外的偏移量,以便该行显示在中间。我已经尝试过您的解决方案,但没有帮助。

以上是关于行插入/删除后无法调整 TableView contentOffset的主要内容,如果未能解决你的问题,请参考以下文章

使用核心数据和数组从 TableView 中插入和删除行

在另一行删除动画之后插入行

从 tableview 中删除一行

iOS 删除一个 tableview 行

无法删除 tableview 行

升级项目后:删除现有行后 NSTableVIew 无法正确更新