簡體   English   中英

SDWebImage + UITableViewCell,滾動時圖像錯誤?

[英]SDWebImage + UITableViewCell, wrong image when scrolling?

我有一個問題,使用SDWebImage將圖像加載到自定義UITableViewCell內的UIImageView。 這是我在UITableView委托中的代碼:

    static NSString *userTableId = @"userTableId";
    UserDetailsTableViewCell *cell = (UserDetailsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:userTableId];
    NSDictionary *user = [userList objectAtIndex:indexPath.row];
    NSInteger position = indexPath.row + 1;
    [cell.userDetailsView loadFromDictionary:user WithIndex:position ForCharitie:false];
        cell.userDetailsView.delegate = self;

    cell.userDetailsView.delegate = self;
    return cell;

這是我的loadFromDictionary代碼:

-(void) loadFromDictionary: (NSDictionary *) dic  WithIndex: (NSInteger) index ForCharitie: (BOOL) isCharitie{
    NSDictionary *userImageDic = [dic objectForKey:@"image"];
    NSString *url =[userImageDic objectForKey:@"url"];

    [userImage setImage:[UIImage imageNamed:@"defaultAvatar"]];
    if ([url class] != [NSNull class]){
        [userImage setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"defaultAvatar"]];
    }
}

現在,問題是如果我在一些圖像完成加載之前向下滾動。 例如,假設我看到前8行,第1,2和3行仍然加載他們的圖像,現在我滾動到9-16,我看到所有這些的defaultAvatar ,並在幾秒后(我想當時第1,2和3行的圖像完成下載),單元格9,10和11上的圖像變為屬於1,2和3的圖像。我不知道是否有辦法阻止圖像下載當我重用細胞,或類似的東西。 謝謝你,對不起我的英文!

如果您在表上設置了UITableViewDelegate,則可以使用委托方法:

- tableView:didEndDisplayingCell:forRowAtIndexPath:

當單元格滾出屏幕時,將圖像設置為NULL(或默認值)。

由於您正在使用SDWebImage,因此取消它可能就像單元格圖像視圖中的cancelCurrentImageLoad一樣簡單。

覆蓋單元類中的prepareForReuse方法並取消所有加載。 別忘了給super打電話

以上回答的例子。 斯威夫特3

func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    (cell as! UITableViewCell).imageView.image = nil
    (cell as! UITableViewCell).imageView.sd_cancelCurrentImageLoad()
}

我得到了空白的圖像與接受的答案,並給出我正在加載的圖像很小,我想讓圖像緩存在后台,而不是取消負載。

  1. 在關閉之前在堆棧上推送一個唯一的id,並在關閉完成時檢查它
  2. prepareForReuse

像這樣:

func updateArtistImage(url: URL) {
        let _eventId = self.event?.id
        SDWebImageManager.shared().loadImage(with: url, options: [], progress: nil) { (image, data, error, cacheType, finished, url) in
            if self.event!.id == _eventId {
                if error == nil {
                    self.artistImageView.image = image
                } else {
                    self.artistImageView.image = UIImage(named: "error_image")
                }
            }
        }
    }

還有這個:

override func prepareForReuse() {
    super.prepareForReuse()
    self.artistImageView.image = nil
}

只要打電話sd_cancelCurrentImageLoad並設置[imageView setImage:nil]之前調用sd_setImageWithURL

[imageView sd_cancelCurrentImageLoad]; 

暫無
暫無

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

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