我正在用Objective C开发项目,并且Xcode版本是10.1。在这个项目中,我正在使用套接字。在这个程序中,我不断地从套接字读取数据。我正在表视图中显示更新的值。为此,我要重新加载表节头文件,就像从套接字中获取数据一样快。意思是如果我得到id = 5,那么我会尝试找到id == 5的部分的索引,而我只会更新该部分。
现在的问题是,当我点击表格标题时,它会打开该节标题的内部行,之后,当我向下滚动时,表格视图会像连续跳跃一样上下移动,因为数据以这种快速的方式传入。
例如:表格视图
案例1 :(滚动正常工作)
情况2 :(滚动将导致跳转标题)
因此在上述结构中,当我们单击标题1并向下滚动时,由于连续的更新过程,下一个标题正在跳跃。
在案例1中,这种滚动标题的跳跃效果不会出现。这仅在情况2中发生。
当我重新加载整个表而不是一次仅加载一个节头时,不会发生此问题。 请帮我解决这个问题。 预先谢谢你。
我试图重新加载节标题,如下所述。
[tableView beginUpdates];
[tableView reloadSections:[NSIndexSet indexSetWithIndex:i] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
答案 0 :(得分:0)
当您重新加载UITableView的部分时,它将尝试再次执行整个渲染过程。这就是说,它将获取行数,节数,获取该行或节的适当单元格,将计算每个行或节的高度,然后在屏幕上绘制。
整个过程需要很多时间。由于所有UI操作都是在作为串行线程的主线程上发生的,并且您正在连续且非常快速地更新表视图部分,因此会引起很多抖动。
处理这种情况的更好方法是稍微延迟更新。请每隔1分钟说一次,进行最新更新。这可以使用RxSwift实现,也可以实现自己的逻辑。
然后,您可以尝试进行的优化是自己更新横断面图,而不是让UITableView替您完成。这意味着,根据UITableView的当前状态,找到要使用数据更新的部分,使用indexPathsForVisibleRows
和cellForRow(at indexPath: IndexPath)
获取单元格并直接更新视图。
如果新数据不更改单元格或部分的高度,则此方法将正常工作。否则,您将不得不使像元的高度无效,这会引入一点抖动。
答案 1 :(得分:0)
如果重新加载节,则与该节有关的所有内容都将重绘,包括行号,标题内容和默认节行为(关闭或扩展)。您需要更改设计或所需解决方案的方法-例如,使表不可关闭(即,标题和子项始终可见)或其他。
答案 2 :(得分:0)
如果您使用“ heightForRowAtIndexPath:”方法来计算高度。也可以使用“ estimatedHeightForRowAtIndexPath”此方法。用行高方法编写代码。