【问题标题】:The table-view moving up and down like jumping continuously上下移动的table-view像连续跳跃一样
【发布时间】:2019-06-19 15:54:30
【问题描述】:

我在一个项目中工作,该项目使用 Objective C 并且 Xcode 版本是 10.1。在这个项目中,我使用的是套接字。在这个应用程序中,我不断地从 Socket 读取数据。我正在将更新的值显示到表格视图中。为此,我重新加载表节标题的速度与数据来自套接字的速度一样快。意味着如果我得到 id = 5,那么我会尝试查找 id == 5 的部分的索引,并且我将只更新该部分。

现在的问题是,当我点击表格标题时,它会打开该部分标题的内行,然后当我向下滚动时,表格视图会像连续跳跃一样上下移动,因为数据来得太快了。

例如。 : 表格视图

案例 1:(滚动运行良好)

  • Section Header 1(当我点击 Header 1 时,会出现第 1 行)
  • 第 2 节标题
  • 第 3 节标题
  • 第 4 节标题
  • 第 5 节标题

案例2:(滚动会导致跳转标题)

  • Section Header 1(当我单击 Header 1 时,将删除第 1 行)
    • 第 1 行
  • 第 2 节标题
  • 第 3 节标题
  • 第 4 节标题
  • 第 5 节标题

所以在上面的结构中,当我们点击 Header 1 然后我们向下滚动时,由于不断更新过程,下一个标题正在跳跃。

滚动中的这种跳跃标题效果不会出现在案例 1 场景中。这只发生在案例 2 中。

当我重新加载整个表格而不是一次重新加载一个节标题时,这个问题没有发生。 请在这个问题上帮助我。 提前谢谢你。

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

【问题讨论】:

    标签: ios objective-c xcode10.1


    【解决方案1】:

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

    【讨论】:

    • 非常感谢@phani。它为我工作。你让我今天一整天都感觉很好。 :)
    【解决方案2】:

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

    整个过程需要很多时间。由于所有的 UI 操作都发生在主线程上,主线程是一个串行线程,并且您正在不断且非常快速地更新表格视图部分,这会导致很多抖动。

    处理这种情况的更好方法是稍微延迟更新。说间隔 1 分钟,获取最新的更新。这可以使用 RxSwift 来实现,也可以实现您自己的逻辑。

    然后,在您这样做之后,您可以尝试的优化是自己更新剖面视图,而不是让 UITableView 为您完成。也就是说,根据 UITableView 的当前状态,找到要更新数据的部分,使用indexPathsForVisibleRows 和cellForRow(at indexPath: IndexPath) 获取单元格并直接更新视图。

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

    【讨论】:

    • 感谢@kerry 的回复。在我的情况下,我只显示部分标题。当用户在任何索引处点击节标题时,单元格将仅对该索引可见。我试图找到获取可见部分标题的方法,但在所有解决方案中,我发现可见部分来自可见行。 [stackoverflow.com/questions/4191317/…
    • 并且您正在更新该行?
    • 是的,我也在更新该行。
    • @JaykarParmar 这应该不是问题。您可以获取剖面视图和行视图并就地更新它们。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多