滚动时避免 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
则无需更新它。
我已经在 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
则无需更新它。