【问题标题】:Load UICollectionView cells without reuse加载 UICollectionView 单元格而不重用
【发布时间】:2015-09-14 21:39:35
【问题描述】:

我有一个只显示三个单元格的 collectionView。每个单元格与我在情节提要中设置的自定义 collectionViewCell 类型相同。我只希望每个单元格实例化一次且仅一次;没有重复使用。

如何从 cellForItemAtIndexPath: 数据源方法返回未重用的单元格?可以这样做吗?

【问题讨论】:

  • 您可以简单地为每个人使用一个唯一的reuseIdentifier,但何必呢。让集合视图处理它
  • Paulw11 的回答有效,我也很好奇你为什么要这样做?

标签: ios objective-c uicollectionview


【解决方案1】:

重复使用UICollectionViewCell 并不意味着您要摆脱以前不再出现在屏幕上的那些。

这是一个提高内存效率的结构化过程,其工作原理如下:

  1. UICollectionView 根据您需要的 UICollectionViewLayout 自动生成不同数量的单元格。
  2. 这些单元格建立在UIScrollView 之上,重复使用它们,而不是为最终将出现的每个单元格分配内存。
  3. 将数据集想象成一个“轮子”,它的大小取决于您需要创建多少个单元格。
  4. 假设您的“轮子”总共有 100 个不同的“视图”,它们将填充单元格
  5. 如果屏幕一次只能显示 5 个,那么加载所有 100 个是没有意义的...只是将在视图中的 5 和准备进入滚动时的屏幕..
  6. 通过使用UICollectionViewDataSource 协议,您的集合视图重新填充刚刚离开屏幕的单元格并将其置于显示列表的下方或上方,以便“重用”而不是导致内存问题。

集合视图非常高效,我建议使用它们内置的内存节省dequeuereusablecellwithidentifier

现在,回答您的问题:

您可以通过将您需要的必要数据放入NSArray 的单元格中(如果需要,可能创建UICollectionViewCell 的子类),从而获得您想要的结果。

您将使用cellForItemAtIndexPath 访问每个对象(在我们的示例中为 1 - 100),并且随着您的滚动,重用单元格的基本原则将显示需要显示的 NSArray 对象。

我希望这是有道理的,它可以帮助您解决问题!

【讨论】:

  • 感谢您的解释。我的问题的根本原因是我没有从根本上依赖数据对象来为我的集合视图提供一致的数据源。现在重构。
  • @vikzilla 没问题。此外,如果数据对象发生变化,请确保您正确使用 reloadData 方法并使用正确的值更新 UICollectionView 协议方法
【解决方案2】:

使用属性:

@property (nonatomic, strong) UICollectionViewCell *firstCell;
@property (nonatomic, strong) UICollectionViewCell *secondCell;
@property (nonatomic, strong) UICollectionViewCell *thirdCell;

在 viewDidLoad 你可以创建它:

 self.firstCell = [[UICollectionViewCell alloc] init];
// Do you need...

你的委托方法,看起来像:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.row) {
    case 0:
        return self.firstCell;
        break;
    case 1:
        return self.secondCell;
        break;
    case 2:
        return self.thirdCell;
        break;

    default:
        return nil;
        break;
}

}

【讨论】:

  • 为什么有人放弃投票,我不明白。 Onik IV 是正确的,因为它正在回答所问的问题。这没有错。不是最好的方法,但有时您只需要有限数量的单元格,例如 3 或 5 个。当您不处理页面视图控制器时,屏幕上只有 3 个单元格可能很有用。
  • 感谢您的评论。我很少使用 Storyboard,但是当它启动时,我喜欢静态 tableViewController。我通常通过代码来做所有的视图,这是通过代码来做静态表格视图(或集合视图)的方式。在我看来,表格的好解决方案,或者当您的单元格数量很少并且它们不同时。
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 2013-10-17
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多