在单个 UIScrollview 中使用多个 UITableViews,如何仅加载可见单元格的单元格数据
Posted
技术标签:
【中文标题】在单个 UIScrollview 中使用多个 UITableViews,如何仅加载可见单元格的单元格数据【英文标题】:With multiple UITableViews in a single UIScrollview, how to only load cell data for visible cells 【发布时间】:2012-05-23 13:15:05 【问题描述】:我在一个 uiscrollview 中有 3 个 uitableview。每个 uitableview 都是全长且不可滚动的,因此外部 uiscrollview 将它们一起滚动。这工作正常,除了 uitableviews 认为所有单元格都是可见的,因此所有单元格都是预先创建的。即使这是可以接受的,除非每个调用都有一个从 url 异步加载的图像视图(缩略图)。我试图弄清楚如何将图像加载限制为仅可见单元格,但仍允许用户滚动外部 uiscrollview(从而模仿 uitableview 行为)。
单个表格的替代设计,其中每个单元格显示 3 个单元格不起作用(基于其他设计要求),因此我坚持采用某种方法来限制图像下载。最大单元数将是 125 个左右。 uiscrollview 委托似乎没有足够的调用来允许即时更新单元格,但我可能是错的。有任何想法吗?
【问题讨论】:
【参考方案1】:也许只是做一个自定义检查:如果 tableView 不可见(因为不在你的 scrollView 的范围内),那么不要在“cellForRowAtIndexPath”中加载 tableView 的图像(或单元格)。
如果tableView可见,则调用reloadData并显示图片。
您可以使用 scrollViewDelegate 方法检查所有这些。
【讨论】:
【参考方案2】:TableViewDatasource 协议实现: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
对于不在范围内的完整表格,您可以通过将 tableview 指针参数与您主动显示的 tableview 进行比较来限制更新并跳过不可见的 tableview。
对于 Cells:考虑到您在同一个滚动视图上实现 3,这是一个更困难的问题。如果您实现了 3 个单独的表视图,每个表视图都是标准实现的,这会更容易一些。这个声明的原因是,如果上面的 Apple 协议实现了例程,则确实只为当前需要显示在屏幕上的单元格调用。通过这种方式,您可以在上面定义的例程中实现您的图像背景加载器,并且您确实会得到您想要的。我已经这样做了,它确实有效。
另一个答案: 也许您应该研究一个自定义表格视图,在其中为单个表格视图定义自己的自定义外观和感觉,该表格视图将您希望的所有信息合并到该单个表格中,从而允许您实现上述另一半。
为了给出更好的答案,我想我必须更深入地研究你最终想要完成的事情。
【讨论】:
我在发帖后马上就想通了,但在获得更多积分之前我无法回答。见下文。 哎呀还有一个小时我才能发帖。【参考方案3】:看来我可以简单地使用 UIScrollViewDelegate scrollViewDidScroll 调用,然后使用滚动视图的 contentOffset.y 为每个表视图使用 tableView indexPathsForRowsInRect 来触发任何可见(或即将出现)的单元格的缩略图。我的单元子类有一个触发缩略图下载的方法。
scrollViewDidScroll 委托方法似乎在您滚动时为每个像素调用,这是完美的。我认为这可能太慢了,但到目前为止这没什么大不了的。唯一的问题是确保在对可见单元格进行排序或其他内容时始终检查它们。
【讨论】:
以上是关于在单个 UIScrollview 中使用多个 UITableViews,如何仅加载可见单元格的单元格数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在启用分页的 UIScrollView 中延迟加载 100 多个页面?
可以在 QtDesigner 的单个 .ui 文件中定义多个表单吗?