iphone - dequeueReusableCellWithIdentifier 不重用单元格

标签 iphone ios objective-c ipad uicollectionview

我有一个 UICollectionView,它带有自定义单元格子类 UICollectionViewCell。在代码中我做了以下事情:

 [self.collectionView_ registerClass:[AHPinterestCell class]
        forCellWithReuseIdentifier:@"AHPinterestCell"];

这就是我的 cellForItem

  AHPinterestCell *cell =
                (AHPinterestCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"AHPinterestCell"
                                                                             forIndexPath:indexPath];

但是,它似乎没有重复使用单元格。在我的每个屏幕的 Collection View 中,它显示大约 9-10 个单元格,但是当我进行无限滚动然后调用 insertItemsAtIndexPath 时,它会在我的自定义单元格上调用 initWithFrame 方法,虽然它可能应该重用我已经拥有的单元格。这是为什么?

编辑:

我正在添加一个示例演示项目来说明问题,可以找到 xcode 项目的链接 here .当你到达底部时,它本质上是在做一个无限滚动,它只是在其中添加更多的东西。但是当您这样做时,它会再次调用 init 方法。

最佳答案

简而言之,您的代码运行良好。正如预期的那样,当单元格滚出屏幕时,它们最终会被标记为可重复使用。当您调用 dequeueReusableCellWithReuseIdentifier 时,如果有可重复使用的单元格,它将这样做。如果没有,它会创建一个。

如果您快速滚动或连续滚动,您将看到正在创建大量单元格的时间。但是如果你做短小的滚动,放开,暂停,让 UI 跟上并重复,那么你会看到很少的单元格被创建。

我将其解释为 iOS 优先考虑 UI 和新单元格的创建,而不是旧单元格的出列,从而允许它们重用。因此,如果您快速翻转,它就很难 catch 并将旧单元格标记为可重复使用。这可能并不完全是坏事,因为这可能是让 Collection View 如此流畅的原因。标记旧单元格以供重用是 iOS 在这里要做的不太重要的事情之一。但很明显,如果内存紧张,这可能是个问题。

顺便说一句,如果你也把 NSLog 放在 dealloc 中,你会注意到当 UI 在快速滚动collection view,它显然有一些逻辑说“哎呀,我有比我真正需要的更多的备用单元格,我要摆脱其中的一些。”实际上,这是一个非常聪明的实现。专注于速度,但会在 UI 安静下来后进行一些内存优化。

关于iphone - dequeueReusableCellWithIdentifier 不重用单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14453741/

相关文章:

ios - 在此处的sdk iOS中通过转弯导航在转弯处设置语音

ios - 使用外观代理仅定位顶部导航栏的栏按钮

iphone - AppDelegate.m 和 View Controller.m 的区别

iphone - 没有为 APNS 获取设备的设备 token ?

ios - 通过鼠标/键盘控制 iOS 设备

ios - 自定义 tableview 单元格下的 UILabel 未更新

ios - 如何找出哪个约束不起作用或产生问题

ios - 强制 View Controller 重新加载以刷新 UIAppearance 更改

iphone - 如何根据 iOS 中的当前设备为单个类加载不同的 xib?

objective-c - 导航回主 ViewController 解雇ViewControllerAnimated 困境