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

时间:2015-01-07 10:49:18

标签: ios objective-c uicollectionview uicollectionviewcell

我对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的所有布局工作等都在笔尖中完成。

每当选中单元格时,我都想在selectionView的标签中设置自定义文字,因此在我的自定义单元格中,我还有以下方法:

//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 个答案:

答案 0 :(得分:0)

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

- (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;
}

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