【问题标题】:Loading and displaying random cells in UICollectionView在 UICollectionView 中加载和显示随机单元格
【发布时间】:2024-01-14 20:45:02
【问题描述】:

先决条件 - 环境:iOS 9.0 或以上 - 使用 Swift 3.0.1

感谢您的回复。我正在更新问题并试图更好地理解这个问题。

发布代码可能会有所帮助,但我不允许发布代码,因为我没有 IP。

但我正在尝试构建诸如日历/节目指南之类的东西,您可以在其中为每个类别提供几天的活动。

想象一下,您左侧的类别在一列中,它们可以是集合veiw 的部分,并且每个类别都有连续几天的事件。

CAT 1 : 事件 1, 事件 2 ... 事件 n CAT 2:事件 1、事件 2 ... 事件 n CAT 3:事件 1、事件 2 ... 事件 n . . . CAT m:事件 1,事件 2 ... 事件 n

问题:整个数据非常动态且庞大。我无法预取所有记录,它们大约超过 80-100K。下载所有数据并将其显示在网格上需要几分钟时间。

用户可以选择任何一天和任何时间,我必须将集合视图滚动到该日期和时间并显示这些事件的类别。此外,用户显然可以双向滚动并浏览事件,在这种情况下,事件会像无限滚动方式一样加载。

但在前一个选项中,当用户跳转到整个时间线上的特定日期和时间时,我必须跳过加载其他以前的事件(因为我还没有它们 - 未知)并显示相关的事件到用户选择的日期和时间。

我没有提前将所有 IndexPaths 显示在屏幕上,如何跳过事件并动态更新集合视图,例如我们动态加载图像以及首先加载并比其他图像更早显示的部分。

我使用事件的 startDate 来计算 xPosition,类别在加载后不会经常更改,因此我们可以以某种方式避免重新加载部分,但这些部分中的项目一直在变化,并且它们以随机方式出现。

当控制器加载第一组事件时,从服务器获取并显示,现在如果用户决定跳转到某个 D-Day 和 T-Time,这可能是整个时间线上的任何位置,我必须获取事件对于这些日期并填充相关部分的项目(在屏幕上可见)并更新界面。这就是我有问题的地方,我没有合适的方法。

希望这更清楚。 I have "tried" to mock this up

【问题讨论】:

  • 如果您显示当前用于计算 xPosition 并用于填充 collectionView 的代码,将会更容易。据我尝试,使用用于填充集合视图的数据,始终可以计算您正在寻找的特定项目的 indexPath。
  • 或者根据您目前的情况,您可能希望尝试按天或月将您的收藏视图分成更相关的部分,这可能会使计算所需单元格的位置更容易
  • 如果您基于索引路径实现健壮的延迟加载,您可以简单地使用scrollToItem(at:at:animated:) (reference) 将集合视图滚动到相关的索引路径。跨度>
  • @BenOng 感谢您的回复。很抱歉,由于我没有 IP,我不允许发布代码。但我正在尝试构建类似日历的东西,你每天都有活动。想象一下,列中左侧的天数,它们可以是集合视图的部分,并且每一天都有一行事件。第 1 天:事件 1,事件 2 ... 事件 n 第 2 天:事件 1,事件 2 ...事件 n 第 3 天:事件 1,事件 2 ...事件 n。 . .第 n 天:事件 1,事件 2 ... 事件 n 问题:整个数据非常动态且庞大。我无法预取所有记录。续 1/2..
  • @BenOng(续 2/2) - 我有 100K 事件要显示,用户可以选择任何一天和任何时间,我必须将集合视图滚动到该日期和时间并显示那些事件。现在用户显然可以双向滚动并浏览事件,在这种情况下,事件就像无限滚动方式一样加载。但是另一个选项,他可以跳到整个时间线上的特定日期和时间,我必须跳过加载其他事件(因为我还没有它们 - 未知)并显示与用户选择的日期相关的事件和时间。我希望这更清楚?

标签: ios swift calendar uicollectionview epg


【解决方案1】:

【讨论】:

  • 行不通。我已经更新了问题,希望能让您更好地了解问题
【解决方案2】:

您遇到了与我的日历项目相同的问题。我实施的解决方案对您不起作用,但我在这里提到它,以便它可以为您提供有关如何根据您的情况解决它的线索。

我的日历有一个功能,用户可以滚动到未来的某个日期。问题是日期单元格可以是自定义大小。因此,由于它们正在滚动到某个未来日期,为了让我知道目的地offset,我需要知道单元格0 -to- destinationOffset 的偏移量,因为单元格大小不同。这意味着我必须查询中间所有单元格的大小,这会导致 2-3 滞后时间(或者在您的情况下,下载时间很长)。

所以这是我的解决方案。 我最初有一个名为sizeForCellsAtMonth 的委托函数,每个月都会调用它以确定大小。我现在已将此函数更改为仅调用一次。

该函数现在只有两个参数:

  1. defaultSizeOfCells
  2. exceptionToDefaults - 这将是单元格大小不同的特定月份

使用这些信息,我可以计算所有月份的大小,因为我事先知道大小。所以我的问题通过改变我看待代表的方式得到了解决。也许您可以尝试沿着这些思路寻找某个地方,或者我的回答为您提供了您可以做什么的线索。

【讨论】:

    最近更新 更多