Mar*_*cus 1 iphone ios sdwebimage
我目前正在使用 SDWebImage 为我的表格单元格加载图片,使用以下代码:
[cell.coverImage sd_setImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] placeholderImage:[UIImage imageNamed:@"imageplaceholder_general"]];
Run Code Online (Sandbox Code Playgroud)
问题是当我上下滚动时,图像被插入了错误的单元格中。在阅读了有关此问题的 StackOverflow 上的一些帖子后,我怀疑这是由于滚动时重复使用了单元格,因此图像的异步下载可能放置在已更改的单元格 indexPath 上。
因此,我实施了几项更改,例如:
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImageView * cellCoverImage = cell.coverImage;
[manager downloadImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL * oriURL) {
NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows];
if ([visibleIndexPaths containsObject:indexPath]) {
cellCoverImage.image = image;
}
}];
Run Code Online (Sandbox Code Playgroud)
甚至可以比较 URL:
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImageView * cellCoverImage = cell.coverImage;
[manager downloadImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL * oriURL) {
if([oriURL isEqual:[self.dataInJSONModel.Content[indexPath.row] CoverImage]])
{
cell.coverImage.image = image;
}
}];
Run Code Online (Sandbox Code Playgroud)
问题仍然存在。或者我可能错误地编程了它?在网上找到了几个建议,但还没有看到具体的解决方案。
需要帮忙!
编辑
我已经对其进行了一些更改,但仍然无法正常工作:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NewsFeedCell * cell = [tableView dequeueReusableCellWithIdentifier:@"NewsFeedCell" forIndexPath:indexPath];
if (self.dataInJSONModel)
{
cell.coverImage.image = nil;
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:[self.dataInJSONModel.Content[indexPath.row] CoverImage] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL * oriURL) {
if ([cell isEqual:[self.tableView cellForRowAtIndexPath:indexPath]])
{
cell.coverImage.image = image;
}
}];
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我遇到了同样的问题,并尝试分配 .image = nil,但不起作用。
最后,我的解决方案是使用取消操作覆盖 UITableViewCell 中的 prepareForReuse:
- (void)prepareForReuse
{
[super prepareForReuse];
[_imageView sd_cancelCurrentImageLoad];
}
Run Code Online (Sandbox Code Playgroud)