自定义选择视图的 UICollectionView 单元格出列问题

Posted

技术标签:

【中文标题】自定义选择视图的 UICollectionView 单元格出列问题【英文标题】:UICollectionView cell dequeue issue with custom selection view 【发布时间】:2015-01-07 10:49:17 【问题描述】:

我对 UICollectionView 及其出队机制有一个非常令人沮丧的问题。

简而言之,我有一个带有标签的自定义 UIView。我将其设置为自定义单元格中的选择背景视图,如下所示:

//My Custom Cell Class    
- (instancetype)initWithCoder:(NSCoder *)aDecoder
        self = [super initWithCoder:aDecoder];

        if(self)
            _selectionView = (MyCustomView *)[[[NSBundle mainBundle] loadNibNamed:@"MyNibName" owner:self options:nil] objectAtIndex:0];
            self.selectedBackgroundView = _selectionView;
            [self bringSubviewToFront:_selectionView];
        
        return self;
    

请注意,单元格和selectedBackgroundView 的所有布局工作等都是在笔尖中完成的。

Whenever the cell is selected, I'd like to set custom text in the label for selectionView so in my custom cell I also have the following method:

//In my Custom cell class
- (void) setSelectedViewLabelText:(NSString *)paramText

    if(!self.isSelected)
        return;
    
    self.selectionView.label.text = paramText;   

设置我的 UICollectionViewController 中的文本:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath


    MyCellClass *selectedCell = (MyCellClass *)[self.collectionView cellForItemAtIndexPath:indexPath];
    [selectedCell setSelectedViewLabelText:someString];  

问题在于,每当 UICollectionView 回收单元格时,它都会再次对其进行初始化,并且显然不会调用 setSelectedViewLabelText 方法。

我有一种烦人的感觉,我可能必须跟踪选定的 indexPaths 并通过它们进行枚举以查看是否选择了单元格并调用该方法,但是我有潜在的大型数据集并且可以预见这将如何成为性能问题.... 有任何想法吗?

提前致谢!

【问题讨论】:

【参考方案1】:

跟踪您选择的单元格,例如:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    
    MyCellClass *selectedCell = (MyCellClass *)[self.collectionView cellForItemAtIndexPath:indexPath];
    [selectedCell setSelectedViewLabelText:someString];
    selectedIndexPath = indexPath;

cellForItemAtIndexPath检查indexPath:

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

    if([selectedIndexPath isEqual:indexPath])
        [cell setSelectedViewLabelText:someString];
    
    return cell;

希望这会有所帮助.. :)

【讨论】:

嗨,谢谢你,我可能应该提到我允许在集合视图中进行多项选择,所以我担心对选定索引路径数组执行 enumerateObjectsUsingBlock 会影响性能。 .

以上是关于自定义选择视图的 UICollectionView 单元格出列问题的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIView 添加到视图后 UICollectionView 不滚动

UICollectionView 自定义布局。不显示或查询补充视图

UICollectionView 中有两个自定义单元格,但第二个单元格的大小不正确

带有自定义标题的 UICollectionView

UICollectionView 自定义布局页脚视图不粘在集合视图的底部

swift中UICollectionview的自定义页脚视图