滚动时避免 UITableViewCell 更新内容

Avoid UITableViewCell updating content when scrolled

我已经在 SO 上发现了一些类似的问题,但似乎没有解决这个特定问题的问题。

我正在使用具有大约 25 个动态单元格的 UITableView。每个单元格都包含一个隐藏的 UIProgressView。当用户点击单元格中的下载按钮下载该项目时,将显示 UIProgressView 并指示下载进度。

我通过为每个单元格分配一个标签来实现这一点,该标签与其对应的 downloadItemID 等效。 MyCell 的每个实例都有自己的进度条 属性。

只要 table 视图在下载过程中不滚动,就可以正常工作。当用户同时下载多个项目时,它也适用。代码如下所示:

UIProgressView *theProgressBar;
for (MyCell *cell in self.tableView.visibleCells) 
{
    if (cell.tag == downloadItemID) theProgressBar = cell.progressBar;
}

float progressPercentage = (float)completedResources / expectedResources;
[theProgressBar setProgress:progressPercentage animated:YES];

问题是当用户滚动 table 视图时,单元格和进度视图被转移到另一个单元格。重置和隐藏新单元格的进度视图非常简单,但是当 original/downloading 单元格滚动回视图时,看不到任何进度。

我已经尝试将活动进度条缓存到字典中并将它们重新分配回 cellForRowAtIndexPath 中的原始单元格,但这给了我相同的结果:在屏幕上和屏幕上滚动单元格后没有可见的进度。即使我能让它们出现,我也怀疑我能否通过滚动我自己的缓存方法让它无缝地工作。

我需要的是将单元格保存在内存中。但是我可以解决 dequeueReusableCellWithIdentifier 问题吗?出现这整个问题是因为我不得不切换到分配单元格的动态系统,但它太动态了。我可以动态创建单元格,但一旦创建就将它们一直保存在内存中,或者至少保留当前正在下载的单元格吗?

(我理解单元格重用是 table 视图的首选方式的原因。)

您正在与框架作对。正如 vadian 在评论中所说,您需要将逻辑和状态信息与单元格分开并将它们放在其他地方。

这是一种方法。

  • 创建一个 class 来保存每个下载状态,例如下载正在进行的标志、下载进度、标题、URL 等
  • 在您的视图控制器中,在创建视图控制器时创建所有下载 object 并将其添加到一个数组中。第一个 object 对应于 table.
  • 中的第一行
  • 每当您使一个单元格出队时,用数组中的数据填充它。 NSIndexPath row 属性 作为数组的索引。
  • 你所有的更新(下载进度)更新数组中的下载objects,然后使用更新后的object更新单元格内容。您可以使用 UITableView cellForRowAtIndexPath 获取特定数组索引的单元格,如果您获取 nil 则无需更新它。