集合查看单元格多项目选择错误

时间:2014-04-09 09:34:10

标签: ios objective-c uicollectionview uicollectionviewcell

我有一个Collection View&我想选择多个项目。为此,我正在使用

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    [self.selectedAsset addObject:self.assets[indexPath.row]];

    UICollectionViewCell* cell=[self.collectionView cellForItemAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor blackColor];
}

此方法将对象添加到selectedAsset NSMutableArray。

这是cellForItemAtIndexPath方法。

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

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

    // load the asset for this cell
    ALAsset *asset = self.assets[indexPath.row];
    CGImageRef thumbnailImageRef = [asset thumbnail];
    UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailImageRef];

    // apply the image to the cell
    cell.imageView.image = thumbnail;
    [cell.label removeFromSuperview];
    //cell.imageView.contentMode = UIViewContentModeScaleToFill;

    return cell;
}

我使用此代码来获取单元格的背景颜色。

UICollectionViewCell* cell=[self.collectionView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor blackColor];

但是当我选择Collection View中的第1个项目时,第1个和第1个“集合视图”中的第15项更改背景颜色。

为什么会这样?请有人给我一个解决方案。

1 个答案:

答案 0 :(得分:2)

好的,这里似乎是你的问题。

1)当您选择第一个单元格时,此方法称为

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

在此方法中,您将单元格背景颜色更改为黑色,因此此单元格从现在开始为黑色。

2)向下滚动并使用方法

加载新单元格
    -(UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;

实施中有一条棘手的问题

dequeueReusableCellWithReuseIdentifier:

因此,对于新单元格,您的应用可能不会创建新单元格,而是显示一个不可见的单元格,例如您在开始时选择的单元格#1,并且具有黑色背景颜色。

因此,对于新单元格,您的应用可能会重复使用可能会被修改的旧单元格。

我的修复就是下一个 -

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

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

//line below might not work, you have to tune it for your logic, this BOOL needs to return weather cell with indexPath is selected or not
BOOL isCellSelected = [self.selectedAsset containsObject:self.assets[indexPath.row]];
if(!isCellSelected)
{
    UICollectionViewCell* cell=[cv cellForItemAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor clearColor]; // or whatever is default for your cells
}

// load the asset for this cell
ALAsset *asset = self.assets[indexPath.row];
CGImageRef thumbnailImageRef = [asset thumbnail];
UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailImageRef];

// apply the image to the cell
cell.imageView.image = thumbnail;
[cell.label removeFromSuperview];
//cell.imageView.contentMode = UIViewContentModeScaleToFill;

return cell;
}