2013-01-21 73 views
2

我使用Nimbuskit的NINetworkImageView。我有一个简单的UICollectionView显示图像网格(NINetworkImageViews)。通常它的作用就像一个魅力,但在某些情况下,一些NINetworkImageViews显示错误的图像。UICollectionView与NINetworkImageViews重复图像

我认为这发生在图像没有路径时,NINetworkImageView必须显示默认图像。有时(几次),而不是显示默认图像,它会出现属于CollectionView的其他NINetworkImageView的其他图像。

下面是相关的代码:

- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"ShelvingCell"; 
    ShelvingCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; 

    // Prueba para ver si esto arregla lo de que se repitan imágenes 
    [cell.feedNetworkImageView prepareForReuse]; 

    cell.feedNetworkImageView.delegate = self; 

    // El collage necesita un tratamiento especial 
    if (indexPath.section == 0 && indexPath.row == 0) 
    { 
     cell.feedTitleLabel.text = @""; 
     cell.lastFeedNewTitleLabel.text = @""; 
     // Prueba para ver si esto arregla lo de que se repitan imágenes 
     [cell.feedNetworkImageView setPathToNetworkImage:@""]; 

     // Prueba para ver si esto arregla lo de que se repitan imágenes 
     [cell.feedNetworkImageView prepareForReuse]; 

     cell.feedNetworkImageView.image = [UIImage imageNamed:@"collage.png"]; 
    } 
    else 
    {  
     MOFeed *feed = [self.feeds objectAtIndex:(indexPath.section*3 + indexPath.row - 1)]; 
     cell.feedTitleLabel.text = feed.title; 

     // Recuperamos la última noticia del feed 
     MONoticia *ultimaNoticia = [feed lastFeedNew]; 

     cell.lastFeedNewTitleLabel.text = ultimaNoticia.title; 

     if (![feed.feedImageURL isEqualToString:@""] && feed.feedImageURL) 
     { 
      // Prueba para ver si esto arregla lo de que se repitan imágenes 
      [cell.feedNetworkImageView prepareForReuse]; 
      [cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL]; 
     } 
     else 
     { 
      // Prueba para ver si esto arregla lo de que se repitan imágenes 
      [cell.feedNetworkImageView prepareForReuse]; 

      cell.feedNetworkImageView.image = [UIImage imageNamed:@"shelvingcell.png"]; 
      // Prueba para ver si esto arregla lo de que se repitan imágenes 
      [cell.feedNetworkImageView setPathToNetworkImage:@""]; 
     } 
    } 
    return cell; 
} 

非常感谢!

卡洛斯

+0

请参阅:http://stackoverflow.com/questions/14204204/update-uiprogressview-in-uicollectionviewcell-for-download-file/14301380#14301380 –

+0

谢谢桑!我已经创建了一个自定义单元格,并通过故事板进行初始化。和setPathToNetworkImage是一个自定义的setter ...所以我不知道这是问题... – Carlos

+0

嗨,如果仍然没有解决,请给我一个关于NINetworkImageView(仅在UIImageView中显示)的简单示例。我以前遇到过这个问题,并解决它,但与SDWebImage:http://www.mediafire.com/?96bhqh9j1njsl7l –

回答

0

卡洛斯,我不知道很多关于NINetworkImageView,但我的理论是,UICollectionView被重用你的意见,你不取消该请求。假设你加载第一个单元格,然后为该图像触发一个请求。然后你开始滚动。在第一个请求完成之前,第一个单元格会被重用,并且可能重新使用该单元格的这个新项目没有图像,因此您不会调用setPathNetwork ...结果,新的重用单元格将具有第一个单元格图像。

在NINetworkImageView中可能有取消请求的方法。每次您重复使用其中一个视图时调用它。

联合国!

+0

感谢LocoMike!我认为这个问题就像你说的那样。但是,我正在调用[cell.feedNetworkImageView prepareForReuse],它执行以下操作:“杀死任何网络请求并用初始图像替换显示的图像。通过取消任何现有请求并再次显示初始图像来准备此视图以供重用” – Carlos

+0

那么,我不知道NINetworkImageView的内部,但是你可以在setImage中调试和设置一个断点,看看被取消的请求是否试图设置图像。对不起,我不能帮助更多,但有太多的图书馆异步图像加载,只是不想跳入另一个:) – LocoMike

1

我有同样的问题,当我深入到这个问题,它看起来像

[cell.feedNetworkImageView prepareForReuse]; 

没有取消所有下载操作。你必须做一些黑客

调用之前

[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL]; 

取消所有网络运营操作,然后创建一个新的网络操作

[self.displayImage.networkOperationQueue cancelAllOperations]; 
self.displayImage.networkOperationQueue = [[NSOperationQueue alloc]init]; 
[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL]; 

它不是有效的,因为你的每个图像下载需要的自己的操作队列,因此可以取消。这可能需要更多的工作来提高效率。但到目前为止,它看起来像没有重复的图像

+0

谢谢查理!我会在几周内尝试解决您的问题 – Carlos