iOS中的PSTCollectionView中的didSelectItemAtIndexPath / didDeselectItemAtIndexPath

时间:2015-01-17 11:15:39

标签: ios objective-c uicollectionview uicollectionviewcell pstcollectionview

我使用UICollectionViewPSTCollectionView合作 图书馆。我创建了一个用户可以选择和取消选择的网格 通过点击UICollectionViewCell来拍摄图像。我要像checkBox一样显示 如果选择了单元格,则为image如果单元格是uncheckedBox图像 取消。我可以选择cell并显示checkBox图像 也可以取消选择。但是当我选择下一个cell时,先前取消选择 cell也会被选中并显示checkBox图像。这是我在UICollectionViewCell subClass

中声明的方法
 -(void)applySelection{
    if(_isSelected){
        _isSelected=FALSE;
        self.contentView.backgroundColor=[UIColor whiteColor];
        self.selectImage.image=[UIImage imageNamed:@"unchecked_edit_image.png"];
    }else{
        _isSelected=TRUE;
        self.contentView.backgroundColor=[UIColor whiteColor];
        self.selectImage.image=[UIImage imageNamed:@"checked_edit_image.png"];
    }
}

这是didSelectItemAtIndexPath和我的代码 didDeselectItemAtIndexPath

- (void)collectionView:(PSTCollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didSelect method called");
    FriendImageCell *cell = (FriendImageCell*)[imageGrid cellForItemAtIndexPath:indexPath];
        [selectedImages addObject:[[list objectAtIndex:indexPath.item] objectForKey:@"thumbnail_path_150_150"]];
         [cell applySelection];

}

- (void)collectionView:(PSTCollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"did deselect called");
    FriendImageCell *cell = (FriendImageCell*)[imageGrid cellForItemAtIndexPath:indexPath];
    [selectedImages removeObjectAtIndex:indexPath.item];
    [cell setSelected:NO];
    [cell applySelection];
}

任何人都可以让我理解我的代码有什么问题吗?使 如果我做错了,我是正确的。试过很多答案 堆栈溢出但没有任何效果。任何帮助,将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

经过几天的反复讨论。我想我终于明白你的问题到底是什么了。您必须忘记将allowsMultipleSelection设置为YES。因此,无论何时选择新单元格,都会取消选择先前的单元格。

<强> allowsMultipleSelection

  

此属性控制是否可以同时选择多个项目。此属性的默认值为NO。

在我之前的回答中,我还建议您制作自己的布尔数组来跟踪所选项目。但是,我才意识到你没必要。 indexPathsForSelectedItems为您提供了一系列选定的索引路径。

<强> indexPathsForSelectedItems

  

NSIndexPath对象的数组,每个对象对应一个选定的项。如果没有选定的项,则此方法返回一个空数组。

事实上,您甚至不必实施didSelectItemAtIndexPathdidDeselectItemAtIndexPath。默认情况下,这两个委托方法将为您调用setSelected:。因此,更合适的方法是将applySelection代码移至setSelected

覆盖自定义setSelected:中的UICollectionViewCell方法。

- (void)setSelected:(BOOL)selected
{
    [super setSelected:selected];

    // Change your UI
    if(_isSelected){
        self.contentView.backgroundColor=[UIColor whiteColor];
        self.selectImage.image=[UIImage imageNamed:@"unchecked_edit_image.png"];
    }else{
        self.contentView.backgroundColor=[UIColor whiteColor];
        self.selectImage.image=[UIImage imageNamed:@"checked_edit_image.png"];
    }
}