[英]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()
}
我得到了空白的圖像與接受的答案,並給出我正在加載的圖像很小,我想讓圖像緩存在后台,而不是取消負載。
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.