UICollectionView在重用时显示旧单元格的值

时间:2015-02-09 23:54:51

标签: ios objective-c uicollectionview reuseidentifier

我有一个UICollectionview根据之前serchbarUIViewController的结果加载。在集合的单元格中,我从互联网上加载图像。调用collectionView:(UICollectionView *)cv cellForItemAtIndexPath:时,我会在单元格的图像上放置占位符,然后开始从Internet下载图像。 下载完成后,我重新加载单元格,以便正确放置最终图像。因此,每个单元格都会调用该方法两次。

这是可能感兴趣的代码部分:

- (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 {

            }
        }];


    }
}

现在奇怪的是。当我第一次在前一个搜索栏中加载特定搜索的集合视图时,行为就是预期的行为。每个单元格被调用两次,我可以在短时间内看到单元格中的占位符,然后出现不同的图像。所以一切都很好。

但是,如果我从显示集合视图的搜索栏-popViewController返回 - 如果我再次加载相同的集合视图,则会发生奇怪的事情 - 所选搜索栏的结果相同 - 。首先,我可以看到旧的细胞 - 我知道它们是旧的细胞,因为新的细胞的方法没有被调用 - 然后我看到占位符,最终的最终图像恰好与旧细胞相同,但效果不好,因为你看到:image-placeholder-image。

问题在于,定义单元格的方法仅对每个单元格调用两次,应该如此,但显示单元格的初始内容。

我已经阅读了一些类似的问题,我尝试了两种方法但没有成功: - 我在我的单元类中实现了Prepareforreuse方法。 - 我使用了-(void)collectionView:(UICollectionView *)cv didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath方法。

正如我所说没有结果。还有其他想法吗?我现在已经和这个问题待了两天了,我真的非常绝望。

0 个答案:

没有答案