UICollectionView 重用单元格问题

Posted

技术标签:

【中文标题】UICollectionView 重用单元格问题【英文标题】:UICollectionView reuse cell issue 【发布时间】:2016-07-19 10:49:04 【问题描述】:

我对收藏视图单元格有疑问。当我的收藏视图第一次加载时,它会显示这样的项目:

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



    CalendarCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"CalendarCell" forIndexPath:indexPath];

    [cell bindDate:_datesMgr.currentMonthItems[indexPath.row] andNowDate:_datesMgr.nowDate];


    // bind events

    if (_eventsMgr.eventsArray.count > 0)

        for (int i = 0; i < _eventsMgr.eventsArray.count ; i ++) 
            [cell bindConference:_eventsMgr.eventsArray[i]];
        
    


    return cell;

在这些方法中是用于将子视图添加到自定义单元格类的逻辑,这取决于某些情况。

一切正常,但是,当重新加载集合视图(我确实在 1 秒后强制重新加载)时,一些单元格被重复使用并放置在其他单元格上,因此,它显示“旧”图像和子视图。

我可以看到强制 uicollection 视图停止重用单元格的可能解决方案(即,每次都加载新单元格)。有没有办法做到这一点?

【问题讨论】:

adding subviews to custom cell 这意味着您是在创建新的子视图实例并添加代码吗?如果是,则需要删除旧的子视图(如果存在)。 @Akhilrajtr 我应该怎么做,并找到我需要删除它们的场合? 您可以为每个子视图添加一个特定的标签并使用相应的标签删除该视图,或者您可以从特定视图中删除所有子视图并重新添加它们。由于您使用的是自定义单元格,我更喜欢在 xib 或情节提要中设计单元格,并使用 outlet 为每个单元格设置值,而不是每次都创建新实例并添加。 【参考方案1】:

尝试在您的自定义UICollectionViewCell 中实现prepareForReuse 重置旧内容的方法

-(void)prepareForReuse 
   [super prepareForReuse];
   self.yourimageview.image = nil; //and etc.

【讨论】:

如果有一个正确的单元格(哪个正确的图像)并且我将图像设置为零? 如果您将图像设置为 nil(实际上您应该删除所有添加的子视图),那么图像将在 cellForItemAtIndexPath 中重置(或重新添加子视图) 对于所有设置为 nil 的图像以及何时重新加载您的单元格,通过 indexPath 再次设置数据 但是如果这样实现,会有闪烁;为什么首先将单元格重用于错误的 indexPath?

以上是关于UICollectionView 重用单元格问题的主要内容,如果未能解决你的问题,请参考以下文章

拖放 UICollectionView 单元格重用问题

重用单元格 UICollectionView - 某些单元格没有被选中

UICollectionView 重用单元格背景问题

UICollectionView 不重用单元格

在 UICollectionView 上禁用单元格重用

如何不在 UICollectionView 中重用单元格 - Swift