0

新手问题。我在每个单元格中都有一个自定义单元UICollectionView格。在单元格的复选框将被点击到“选中”状态后,我需要填充该数组(自定义 UIButton 具有适当的选中/未选中图像连接到 IBAction 并更改内部单元格和复选框状态图像)。我不能用于标记,因为我用它来预览手机照片。第一个想法是通过点击复选框将单元格图像添加到“选中”状态,但如果用户想要取消选中复选框,我无法跟踪我需要从数组中删除的确切 UIImage 内容。最痛苦的方法是什么?UIImageUIButtonUIImagesBOOL-didSelectItemAtIndexPath:NSMutableArray

PS:这是我连接到复选框的方法的列表

- (void)theCheckboxTapped:(UIButton*)sender
{
    cell = (CustomCell *)sender.superview.superview;
    if (cell)
    {
        if ([cell isSelected] == NO)
        {
            UIImage *img1 = [UIImage imageNamed:@"checked.png"];
            [[(CustomCell *)cell checkboxSign] setImage:img1 forState:UIControlStateNormal];
        }

        if ([cell isSelected] == YES)
        {
            UIImage *img2 = [UIImage imageNamed:@"unchecked.png"];
            [[(CustomCell *)cell checkboxSign] setImage:img2 forState:UIControlStateNormal];
        }
        cell.isSelected =! cell.isSelected;
    }
}

第一个想法是制作单元格数组并检查该单元格的 BOOl 是否等于 YES 或 NO 并将适当的单元格图像添加到数组中

4

2 回答 2

1

为了解决这个问题,有很多解决方案。但是我要解释的那个很简单,但这比其他方法消耗更多的内存。

脚步:-

  1. 创建两个具有容量单元计数的阵列。添加此数组中的所有图像,并在没有选择单元格时最初仅添加布尔值 false。为此,您可以添加 0。

    NSMutableArray *imageArray = [[NSMutableArray alloc]init];

    NSMutableArray *boolArray = [[NSMutableArray alloc]init];

  2. 当您检查任何单元格按钮时,然后将 boolArray 数组中的 0 替换为 1,反之亦然。

  3. 并重新加载表。在重新加载期间,如果该位置的第二个数组中的值为 0,则无需从第二个中选择图像,如果值为 1,则选择图像。

要更改值,您可以替换 nsmutablearray 的 ObjectAtIndex 方法。

编辑: 不需要像上面那样做。一种更简单的解决方案是根据您的代码here。正如我所看到的,您可以获得细胞。因此,您可以为 imageView 设置标签,根据标签,您还可以获取要在其中添加图像的单元格的 imageview。为此创建 imageArray 和其中的所有图像。现在添加图像,如:

 if cell.selected = True;
   cell.imageView.image = [imageArray objectAtIndex:@"Cell's tage here or buttons tag here which is equal to indexPath.row"];
else
   cell.imageView.image = @"Default image or no image here".
于 2013-02-06T16:41:54.157 回答
1

我已经以一种简单的方式解决了。只有在加载 50-60 个图像 uiCollectionView 后变得非常慢,所以我编写了一个方法来从现有单元格中删除所有 imageView。

-(void)cleanCache{

NSMutableArray *visibleThumbViews = [NSMutableArray arrayWithCapacity:self.collectionView.visibleCells.count];

for (ThumbCell *t in self.collectionView.visibleCells) {
    [visibleThumbViews addObject:t.thumbView];
}
for (ThumbView *t in self.thumbsViews) {

    if (![visibleThumbViews containsObject:t]) {
        [t unloadImage];
        [t removeFromSuperview];
    }

}
}

此处调用此方法:

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


if (indexPath.row % 30 == 0) {
    [self cleanCache];
    NSLog(@"clean");
}

ThumbCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"ThumbCellID" forIndexPath:indexPath];
cell.thumbView = [self.thumbsViews objectAtIndex:indexPath.row];
cell.thumbView.frame = cell.bounds;

return cell;

}

它工作得很好:P

抱歉英语不好

更新:我错过了这个委托方法:

-(void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{
ThumbView *t = [self.thumbsViews objectAtIndex:indexPath.row];
[t unloadImage];
[t removeFromSuperview];

}

于 2013-04-29T16:34:12.853 回答