出队的 UICollectionViewCell 未刷新

Posted

技术标签:

【中文标题】出队的 UICollectionViewCell 未刷新【英文标题】:Dequeued UICollectionViewCell not refreshed 【发布时间】:2014-01-22 13:48:03 【问题描述】:

我有一个带有UICollectionView 的应用程序,带有水平滚动的单元格(一次只显示一个单元格)。每个单元格承载一个UITableView,它在每个UITableViewCell 中显示内容(URL 链接)。 问题是UICollectionView 的前两个单元格显示正确的内容,但从第三个单元格开始,内容是从出列单元格显示的。仅当用户向下滚动然后向上滚动到顶部时,才会显示出队单元格的 UITableView 上的正确内容。 例如,第三个单元格的内容是来自第一个单元格的内容。 该单元格是托管UITableView 的自定义UICollectionViewCell。自定义单元格实现了UITableViewDataSourceUITableViewDelegate。 我搜索了不同的论坛和网站,找到了刷新的解决方案。 我尝试将[collectionView reload] 添加到-cellForItemAtIndexPath: 方法中,但它进入了恒定循环。我知道这不是正确的地方,但我没有任何其他方法会导致刷新(仅滚动单元格会加载下一个单元格的内容)。 有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

您遗漏了一些关于出队的事实。 当您 3d 自定义 UICollectionViewCell 出列时,它不会像第一次显示时那样分配。相反,您的集合视图“重用”第一个单元格来显示 3d。清除自定义单元格类中内容的最佳时机是-(void)prepareForReuse。如果您覆盖它并清除它的内容,-cellForItemAtIndexPath: 将出列“清除”单元格,您可以进一步自定义。 但是,我不完全知道如何“清除”tableView,不确定是否可能。你必须在-cellForItemAtIndexPath: 的tableView 上reloadData。示例:

- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath

    MyCVCell *cell = [collectionView dequeueReusableCellWithIdentifier:@"MyCVCell" forIndexPath:indexPath];
    cell.arrayOfURLsForDisplay = self.arrayOfArraysOfURLs[indexPath.row];
    [cell.tableView reloadData];
    return cell;

我的意思是你的 viewController 中有一些 arrayOfArraysOfURLs,你在自定义单元格中显示来自一些 arrayOfURLsForDisplay 的 URL

【讨论】:

非常感谢您的帮助。我不得不在 UITableView 的 -(void)prepareForReuse 方法中调用 clearsContextBeforeDrawing ([cell.tableView clearsContextBeforeDrawing];) 方法,然后调用方法 reload ([ cellForItemAtIndexPath 中的 cell.tableView reloadData])。在更改上述代码后,它可以正常工作。您的回答很有帮助(我应该在浪费大量时间尝试自己之前发布它)。另外,我调用 [cell.tableView clearsContextBeforeDrawing] 并在 cellForItemAtIndexPath 中重新加载它的工作方式相同,无需 prepareforReuse,仅供参考。 没问题。但是,使用此类控件(UICollectionViewUITableView)的一般做法要求您覆盖 -prepareForReuse 以使单元格进入“默认”状态。在特定情况下(例如您的情况)可能没有必要这样做。【参考方案2】:

我遇到了类似的问题,我没有在cellForItemAtIndexPath 中使用[cell.tableView reloadData],而是在prepareForUse 方法中调用了collectionView.reloadData,该方法在您的自定义UITableviewCell 中被覆盖

【讨论】:

以上是关于出队的 UICollectionViewCell 未刷新的主要内容,如果未能解决你的问题,请参考以下文章

动态/可出队的 UITableviewcells 内的 UITextfield

出队的 UITableViewCell 在滚动之前布局不正确(使用自动布局)

原子出队的最简单方法?

如何防止出队的集合视图单元格相互重叠?

出队自定义 UICollectionViewCell 但单元格中的属性为零

顺序队列总结