UITableView 要求一个在屏幕上不可见的单元格

Posted

技术标签:

【中文标题】UITableView 要求一个在屏幕上不可见的单元格【英文标题】:UITableView asks for a cell that is not visible on screen 【发布时间】:2013-11-01 23:23:38 【问题描述】:

我有一个 UITableView,其中填充了来自 Web 服务的数据。我使用循环缓冲区来缓存新数据并删除旧数据,因此内存不会过载。 当表视图调用 cellForRowAtIndexPath 并且视图控制器查询缓冲区以获取数据时,所有的魔法都会发生。此外,正确的实现依赖于这样一个事实,即表格视图仅在单元格在屏幕上可见时才会调用该方法。如果数据可用,我将它返回给视图控制器,如果没有,我返回 nil,视图控制器知道如何处理,并开始获取所需的数据。提取完成后,我在表上调用“reloadData”,数据就会出现。

我有一个奇怪的问题,即使用户滚动到第 200 行,表格视图也会向视图控制器询问索引路径零或一处的行。鉴于缓冲区的实现和大小,此时显示的内容是错误的。

只是为了说明,使用调试器输出,从 cellForRowAtIndexPath 内部:

 po indexPath <NSIndexPath: 0xb02b100> length = 2, path = 0 - 0

 po [self.tableView indexPathsForVisibleRows] <__NSArrayM 0x9b8f7f0>( <NSIndexPath: 0x9b42910> length = 2, path = 0 - 19, <NSIndexPath: 0x9b82080> length = 2, path = 0 - 20, <NSIndexPath: 0x9b6e2a0> length = 2, path = 0 - 21, <NSIndexPath: 0x9b39010> length = 2, path = 0 - 22, <NSIndexPath: 0x9b42d80> length = 2, path = 0 - 23, <NSIndexPath: 0x9b98a20> length = 2, path = 0 - 24, <NSIndexPath: 0x9b9dc50> length = 2, path = 0 - 25, <NSIndexPath: 0x9b9e4d0> length = 2, path = 0 - 26, <NSIndexPath: 0x9b40740> length = 2, path = 0 - 27, <NSIndexPath: 0x9b40750> length = 2, path = 0 - 28, <NSIndexPath: 0x9b88150> length = 2, path = 0 - 29, <NSIndexPath: 0x9b88160> length = 2, path = 0 - 30, <NSIndexPath: 0x9b97120> length = 2, path = 0 - 31, <NSIndexPath: 0x9b97130> length = 2, path = 0 - 32, <NSIndexPath: 0x9b44cf0> length = 2, path = 0 - 33, <NSIndexPath: 0x9b44d00> length = 2, path = 0 - 34, <NSIndexPath: 0x9b8d580> length = 2, path = 0 - 35, <NSIndexPath: 0x9b8d590> length = 2, path = 0 - 36 )

有没有人遇到过这么奇怪的问题?

【问题讨论】:

【参考方案1】:

表格视图的 cellForRowAtIndexPath: 不会被调用来只抓取需要可见的单元格;表格视图通常会抓取几个额外的单元格,以便在用户滚动时为它们做好准备。

为了说服自己,记录 cellForRowAtIndexPath: 的返回值。如果 6 个单元格可见,我敢打赌 cellForRowAtIndexPath: 被调用超过 6 次。

【讨论】:

我不明白为什么它会被调用超过6次? willShowCellAtIndexPath 还记录显示第 0 行的 indexPath。 表格视图框架正在缓冲其表格单元格。至于为什么表格视图在你处于表格底部时请求第 0 行,我无法给出明确的答案。

以上是关于UITableView 要求一个在屏幕上不可见的单元格的主要内容,如果未能解决你的问题,请参考以下文章

解析的提要在 UITableView 上不可见,cellForRowAtIndexPath 方法未被访问

xCode:UITableView 无法查看/访问所有单元格

UITableView 在点击屏幕之前不可见

当元素/div在屏幕上不可见时更改css

UITableView 中的称重传感器

Flutter:检测任何在屏幕上不可见但在小部件树中的小部件的重建