簡體   English   中英

帶有NINetworkImageViews的UICollectionView重復圖像

[英]UICollectionView with NINetworkImageViews repeats images

我正在使用Nimbuskit的NINetworkImageView。 我有一個簡單的UICollectionView,它顯示圖像網格(NINetworkImageViews)。 通常,它的工作原理像一個超級按鈕,但是在某些情況下,某些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;
}

非常感謝!

卡洛斯

我遇到了同樣的問題,當我深入研究問題時,看起來

[cell.feedNetworkImageView prepareForReuse];

沒有取消所有下載操作。 你必須做一點hack

通話前

[cell.feedNetworkImageView setPathToNetworkImage:feed.feedImageURL];

取消所有網絡操作操作,然后創建一個新的網絡操作

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

由於您每次下載映像都需要它自己的操作隊列,因此可以取消它,因此效率不高。 這可能需要更多的工作才能提高效率。 但到目前為止,似乎沒有重復的圖像

卡洛斯,我對NINetworkImageView不太了解,但是我的理論是UICollectionView正在重用您的視圖,並且您不會取消請求。 假設您加載了第一個單元格,然后對該圖像觸發了一個請求。 然后,您開始滾動。 該第一個單元將在第一個請求完成之前被重用,並且可能這個重用該單元的新項沒有圖像,因此您不必調用setPathNetwork ...結果,新的重用單元將具有第一個單元圖像。

NINetworkImageView中可能存在一種取消請求的方法。 每次重用這些視圖之一時調用它。

sal!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM