我在使用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的图像。
我不知道当我重复使用单元格时,是否有办法阻止图像下载,或类似的东西。
谢谢你,对不起我的英文!
答案 0 :(得分:16)
如果您在表上设置了UITableViewDelegate,则可以使用委托方法:
- tableView:didEndDisplayingCell:forRowAtIndexPath:
将图像设置为NULL(或默认值)。
由于您正在使用SDWebImage,因此取消它可能就像单元格图像视图上的"cancelCurrentImageLoad
"一样简单。
答案 1 :(得分:3)
覆盖单元类中的prepareForReuse
方法并取消所有加载。别忘了拨打super
答案 2 :(得分:1)
上面的答案示例。斯威夫特3
.menu {
position: absolute;
display: inline-block;
margin-left: 100px;
}
.menu:before {
content: " ";
display: inline-block;
position: absolute;
height: 100%;
border-left: 1px solid;
border-image: linear-gradient(to top, transparent, #f9f9f9 20%, #f9f9f9 80%, transparent) 0 0 0 1;
border-image: -webkit-linear-gradient(top, transparent, #f9f9f9 20%, #f9f9f9 80%, transparent) 0 0 0 1;
border-image: -moz-linear-gradient(top, transparent, #f9f9f9 20%, #f9f9f9 80%, transparent) 0 0 0 1;
-webkit-border-image: -webkit-linear-gradient(top, transparent, #f9f9f9 20%, #f9f9f9 80%, transparent) 0 0 0 1;
}
答案 3 :(得分:0)
我收到了接受答案的空白图片,并且我正在加载的图片很小,我想让图片在后台缓存,而不是取消加载。
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
}
答案 4 :(得分:0)
在致电sd_cancelCurrentImageLoad
之前,只需致电[imageView setImage:nil]
并设置sd_setImageWithURL
。
[imageView sd_cancelCurrentImageLoad];