0

初心者の質問。すべてのセルにカスタムUICollectionViewセルがUIImageありUIButtonます。UIImagesセルのチェックボックスが「チェック済み」状態にタップされた後、その配列を埋める必要があります(内部セルBOOLとチェックボックス状態の画像を変更してIBActionに接続された適切なチェック済み/チェックなしの画像を含むカスタムUIButton)。-didSelectItemAtIndexPath:細胞写真のプレビューに使用しているため、マーキングには使用できません。最初のアイデアは、チェックボックスをタップして「チェック済み」状態にすることで細胞画像を追加することでしたNSMutableArrayが、ユーザーがチェックボックスをオフにしたい場合は、配列から削除する必要のあるUIImageを正確に追跡できません。これを行うための最も苦痛な方法は何ですか?

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

最初のアイデアは、セルの配列を作成し、このセルのブール値がYESまたはNOに等しいかどうかを確認し、適切なセル画像を配列に追加することでした。

4

2 に答える 2

1

これを解決するために、多くの解決策があります。しかし、私が説明しているのは簡単ですが、これは他の方法よりも少し多くのメモリを消費します。

手順:-

  1. 容量セル数で 2 つの配列を作成します。この配列にすべての画像を追加し、セルが選択されていない場合は最初に bool 値 false のみを追加します。これには、0 を追加できます。

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

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

  2. セル ボタンをチェックしたら、boolArray 配列の 0 を 1 に、またはその逆に置き換えます。

  3. そして、テーブルをリロードします。リロード中にその位置の 2 番目の配列の値が 0 の場合、2 番目の配列から画像を選択する必要はなく、値が 1 の場合は画像を選択します。

値を変更するには、nsmutablearray の ObjectAtIndex メソッドを置き換えることができます。

編集: 上記のようにする必要はありません。ここでのコードによると、より簡単な解決策が1つあります。私が見ているように、あなたは細胞を手に入れることができます。したがって、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 に答える