2

以前UICollectionviewの の の結果に基づいてロードされた があります。コレクションのセルには、インターネットから画像を読み込みます。が呼び出されたら、セルの画像にプレースホルダーを配置し、インターネットから画像のダウンロードを開始します。ダウンロードが完了したら、セルをリロードして、最終的な画像が適切に配置されるようにします。したがって、このメソッドはセルごとに 2 回呼び出されます。serchbarUIViewControllercollectionView:(UICollectionView *)cv cellForItemAtIndexPath:

これは、興味深いかもしれないコードの一部です。

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


TXCeldaPOICollection *cell = [cv dequeueReusableCellWithReuseIdentifier:@"CeldaPOI" forIndexPath:indexPath];
...
       NSNumber *estaDisponible=[disponibles objectAtIndex:indexPath.row];
    if ([estaDisponible boolValue]==YES) {
        cell.imgCelda.image=[imagenes objectAtIndex:indexPath.row];
        NSLog(@"Imagen disponible en la celda numero numero %ld",(long)indexPath.row);
    } else {
        cell.imgCelda.image=[UIImage imageNamed:@"placeholder.png"];
        NSLog(@"Placeholder colocado en la celda numero numero %ld",(long)indexPath.row);
        // Monto la URL de descarga:
        NSString *urlDescarga=kBaseURL;

        urlDescarga=[urlDescarga stringByAppendingString:[[self.listaCeldas objectAtIndex:indexPath.row] valueForKey:@"foto1"]];
        NSURL *direccion=[NSURL URLWithString:urlDescarga];
        [self downloadImageWithURL:direccion conOrden:self.estadioFiltrado completionBlock:^(BOOL succeeded, UIImage *image, NSInteger ordenacion) {
            if (succeeded) {

                NSLog(@"Imagen descargada estadio %ld  orden %ld  indice %ld poi %ld@",self.estadioFiltrado, ordenacion, indexPath.row, [seleccionado.identificador integerValue]);

                if (ordenacion==self.estadioFiltrado) {
                    if (image!=nil) {
                        //Meto comprobacion de no rebase del array aunque genere algun error me protejo frente a cueelgues
                        NSInteger numeroImagenes= imagenes.count;
                        if (indexPath.row<=numeroImagenes-1) {

                            [imagenes replaceObjectAtIndex:indexPath.row withObject:image];
                            [disponibles replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:YES]];
                            NSArray *recargar=[[NSArray alloc] initWithObjects:indexPath, nil];
                             NSLog(@"Imagen DESCARGADA numero %ld y llamando a recargar ccelda",(long)indexPath.row);
                            [self.coleccion reloadItemsAtIndexPaths:recargar];
                        }
                    }
                }

            } else {

            }
        }];


    }
}

奇妙なことが今来ます。前の検索バーで特定の検索のコレクションビューを最初に読み込んだときの動作は期待どおりです。すべてのセルが 2 回呼び出され、セル内のプレースホルダーが短時間表示された後、さまざまな画像が表示されます。だから、すべてがOKです。

しかし、コレクションビューが表示されているものから検索バーに戻ると-popViewController、同じコレクションビューを再度ロードすると奇妙なことが起こります-検索バーが選択されたのと同じ結果です-。最初に古いセルが表示されます。新しいセルのメソッドが呼び出されないため、それらが古いセルであることはわかっています。次に、プレースホルダーが表示され、最終的に古いセルと同じである最終的な画像が表示されますが、効果は次のように表示されるため、良くありません: image-placeholder-image.

問題は、セルを定義するメソッドがセルごとに 2 回しか呼び出されないことですが、セルの初期コンテンツが表示されます。

私はいくつかの同様の質問を読んだことがあり、成功せずに 2 つのアプローチを試みました。 -Prepareforreuseメソッドをセル クラスに実装しました。--(void)collectionView:(UICollectionView *)cv didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPathメソッドを使用しました。

私が言ったように、結果はありません。他のアイデアはありますか?私はこの問題を2日間抱えており、本当に必死です.

4

0 に答える 0