桌子视图像连续跳跃一样上下移动

时间:2019-06-19 05:05:58

标签: ios objective-c xcode10.1

我正在用Objective C开发项目,并且Xcode版本是10.1。在这个项目中,我正在使用套接字。在这个程序中,我不断地从套接字读取数据。我正在表视图中显示更新的值。为此,我要重新加载表节头文件,就像从套接字中获取数据一样快。意思是如果我得到id = 5,那么我会尝试找到id == 5的部分的索引,而我只会更新该部分。

现在的问题是,当我点击表格标题时,它会打开该节标题的内部行,之后,当我向下滚动时,表格视图会像连续跳跃一样上下移动,因为数据以这种快速的方式传入。

例如:表格视图

案例1 :(滚动正常工作)

  • 标题1(单击标题1时,将显示第1行)
  • 第2部分标题
  • 第3部分标题
  • 第4部分的标题
  • 第5部分的标题

情况2 :(滚动将导致跳转标题)

  • 标题1(单击标题1时,将删除第1行)
    • 第1行
  • 第2部分标题
  • 第3部分标题
  • 第4部分的标题
  • 第5部分的标题

因此在上述结构中,当我们单击标题1并向下滚动时,由于连续的更新过程,下一个标题正在跳跃。

在案例1中,这种滚动标题的跳跃效果不会出现。这仅在情况2中发生。

当我重新加载整个表而不是一次仅加载一个节头时,不会发生此问题。 请帮我解决这个问题。 预先谢谢你。

我试图重新加载节标题,如下所述。 [tableView beginUpdates]; [tableView reloadSections:[NSIndexSet indexSetWithIndex:i] withRowAnimation:UITableViewRowAnimationNone]; [tableView endUpdates];

3 个答案:

答案 0 :(得分:0)

当您重新加载UITableView的部分时,它将尝试再次执行整个渲染过程。这就是说,它将获取行数,节数,获取该行或节的适当单元格,将计算每个行或节的高度,然后在屏幕上绘制。

整个过程需要很多时间。由于所有UI操作都是在作为串行线程的主线程上发生的,并且您正在连续且非常快速地更新表视图部分,因此会引起很多抖动。

处理这种情况的更好方法是稍微延迟更新。请每隔1分钟说一次,进行最新更新。这可以使用RxSwift实现,也可以实现自己的逻辑。

然后,您可以尝试进行的优化是自己更新横断面图,而不是让UITableView替您完成。这意味着,根据UITableView的当前状态,找到要使用数据更新的部分,使用indexPathsForVisibleRowscellForRow(at indexPath: IndexPath)获取单元格并直接更新视图。

如果新数据不更改单元格或部分的高度,则此方法将正常工作。否则,您将不得不使像元的高度无效,这会引入一点抖动。

答案 1 :(得分:0)

如果重新加载节,则与该节有关的所有内容都将重绘,包括行号,标题内容和默认节行为(关闭或扩展)。您需要更改设计或所需解决方案的方法-例如,使表不可关闭(即,标题和子项始终可见)或其他。

答案 2 :(得分:0)

如果您使用“ heightForRowAtIndexPath:”方法来计算高度。也可以使用“ estimatedHeightForRowAtIndexPath”此方法。用行高方法编写代码。