SDWebImage + UITableViewCell,滚动时图像错误?

时间:2014-05-19 15:03:12

标签: ios uitableview sdwebimage

我在使用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的图像。 我不知道当我重复使用单元格时,是否有办法阻止图像下载,或类似的东西。 谢谢你,对不起我的英文!

5 个答案:

答案 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)

我收到了接受答案的空白图片,并且我正在加载的图片很小,我想让图片在后台缓存,而不是取消加载。

  1. 在关闭之前在堆栈上推送一个唯一的id,并在关闭完成时检查它
  2. prepareForReuse
  3. 像这样:

    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];