dequeueReusableCellWithIdentifier 不重用单元格

2023-11-25

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

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

这就是我的cellForItem

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

然而,它似乎并没有重复使用该单元。在我的每个屏幕的集合视图中,它显示大约 9-10 个单元格,但是当我无限滚动然后调用insertItemsAtIndexPath它称为initWithFrame我的自定义单元格上的方法,而它可能应该重用我已有的单元格。为什么是这样?

EDIT:

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


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

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

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

顺便说一句,如果你放一个NSLog in dealloc你也会注意到,当用户界面在集合视图中进行快速滚动后最终赶上时,它显然有一些逻辑说“哎呀,我的备用单元格比我真正需要的多,我是将摆脱其中一些。”实际上,这是一个非常聪明的实现。注重速度,但一旦 UI 安静下来就会进行一些内存优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dequeueReusableCellWithIdentifier 不重用单元格 的相关文章

随机推荐

  • QListView 当列表为空时显示文本

    当 QListView 中没有项目时 我想显示一些文本 例如 没有项目 我尝试重写QListView的paintEvent方法 但没有任何效果 下面的代码展示了一种简单的方法 通过重载paintEvent视图的方法 文本的绘制可能应该使用样
  • jQuery 表单验证不起作用

    我花了几个小时在这上面 但我不知道为什么这个 jquery validate 不起作用 我最后把它分解到最低限度 但它仍然不起作用 这是实际的代码
  • 如何通过GA4测量协议识别用户所在国家

    可以通过 GA4 测量协议检索地理位置吗 我必须如何配置 json 正文来发送地理位置 例如通过 HitBuilder 我有同样的问题 并在下面的票证中询问谷歌 https issuetracker google com issues 23
  • .Net 和 iPhone 之间的 AES 互操作性?

    我需要加密 iPhone 上的字符串并将其发送到 Net Web 服务进行解密 我可以在 iPhone 上使用 Net 进行加密 解密 但来自 iPhone 的加密字符串无法通过 Net 解密 我收到的错误是 填充无效且无法删除 Net代码
  • 如何使用 PHP 连接 Dropzone.js 上传的分块文件?

    我使用 Dropzone js 获取各种类型的文件 包括图像和非图像 例如 PDF 并将它们以 1mb 块的形式上传到我们的服务器 然后 我尝试使用 PHP 连接这些文件 然后将它们上传到我们公司的 FileMaker 数据库 到目前为止
  • 在 github 操作上运行 firebase 模拟器

    我正在尝试在 Github Actinos 上运行测试 但经过多次尝试后我无法做到这一点 接收 错误 firestore Firestore 模拟器已退出 因为未安装 java 您可以从以下位置安装它https openjdk java n
  • PHP sendmail 在 Ubuntu 命令行中工作,但不能在 php 文件中工作

    我在 Ubuntu 上使用 PHP 和 apache 安装了 sendmail 当我尝试以下命令行时 php r mail email protected test test 它成功发送电子邮件 但是 运行文件 test send mail
  • 在 C# 客户端中为 gRPC 设置 keepalive

    我在 C 中使用 gRPC 客户端并使用长期存在的双工流 但是 TCP 连接有时会关闭 因此我想在客户端中使用 keepalive 服务器 用 Go 编写 已经针对 keepalive 进行了正确配置 并且已经使用 Go 编写的客户端进行了
  • 在设备上运行 OCUnit 应用程序测试套件时偶尔出现错误

    运行应用程序测试 即在设备上 时 我的 OCUnit 测试套件遇到一些问题 有时 我会收到一个棘手的错误 该错误似乎是从 OCUnit 类引发的 我一直在尝试查看添加到测试套件中的文件 但无法理解它 在设置测试目标时 我遵循了 Apple
  • JTextField,使用文档过滤器过滤整数和句点

    编辑 在帖子末尾添加我们能够实现的答案 这是我在 SO 的第一篇文章 所以我希望我能问好一切 尽管发布了类似的问题 但我进行了搜索 但没有找到我的问题的答案 所以我希望这不是重新发布 这就是我得到的 一个使用的小应用程序JTextField
  • 在SendComplete中处置SmtpClient?

    当我使用SmtpClient的SendAsync发送电子邮件时 如何处理smtpclient实例正确吗 比方说 MailMessage mail new System Net Mail MailMessage Body MailBody T
  • Python 中与 pandas 进行大型合并时出现 MemoryError

    我正在用 pandas 来做outer合并一组大约 1000 2000 个 CSV 文件 每个 CSV 文件都有一个标识符列id它在所有 CSV 文件之间共享 但每个文件都有一组唯一的 3 5 列列 大约有 20 000 个独特的id每个文
  • openpyxl 无法读取严格的 Open XML 电子表格格式:用户警告:文件包含 Sheet1 的无效规范。这将被删除

    我的一些用户 都使用 Mac 已将 Excel 上传到我的应用程序中 但应用程序拒绝了它 因为该文件似乎是空的 经过一些调试后 我确定该文件是以 Strict Open XML Spreedsheet 格式保存的 并且 openpyxl 2
  • 如何限制哪些国家/地区可以查看我的网站 ( PHP )

    在 PHP 中有一个简单的方法可以做到这一点 我想确保只有来自某些国家 地区的网络请求才能访问我的网站 有任何想法吗 使用 IP 地理定位数据库 有些是免费的 和 SERVER REMOTE ADDR 来获取访问者的 IP 地址 http
  • Numpy 中 Scipy 模式函数的替代方案?

    numpy 中是否有另一种方法来实现 scipy stats mode 函数以获取 ndarrays 中沿轴最频繁的值 无需导入其他模块 即 import numpy as np from scipy stats import mode a
  • onActivityResult 未在片段 android 中调用[重复]

    这个问题在这里已经有答案了 这是我从画廊拍照的代码 public class FragmentLayout1 extends Fragment implements OnClickListener View root Context c B
  • dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么

    我只是想知道当我们必须使用这些设置并获取驱动程序 API 时 可能的用例是什么 我所知道的是数据被保存了 稍后我们可以使用数据来做一些事情 我的问题是我们什么时候真的需要这样做 These exports can t be GPL due
  • 这是实现“记住我”功能的合理方法吗

    如果用户登录网站并说 记住我 我们会获取该用户的唯一标识符 使用 RijndaelManaged 对其进行加密 密钥大小为 256 并将其放置在 httponly cookie 中 设置有效期为 120 天 每次成功向服务器请求都会刷新过期
  • 什么是具体化?

    我知道Java通过擦除实现参数多态性 泛型 我明白了什么是删除 我知道 C 通过具体化实现参数多态性 我知道这可以让你写作 public void dosomething List
  • dequeueReusableCellWithIdentifier 不重用单元格

    我有一个UICollectionView使用自定义单元格子类化UICollectionViewCell 在代码中我做了以下事情 self collectionView registerClass AHPinterestCell class