以前UICollectionview
の の の結果に基づいてロードされた があります。コレクションのセルには、インターネットから画像を読み込みます。が呼び出されたら、セルの画像にプレースホルダーを配置し、インターネットから画像のダウンロードを開始します。ダウンロードが完了したら、セルをリロードして、最終的な画像が適切に配置されるようにします。したがって、このメソッドはセルごとに 2 回呼び出されます。serchbar
UIViewController
collectionView:(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日間抱えており、本当に必死です.