您好我正在开发IOS应用程序。我的应用程序包含表格视图,图像作为我的表格的一部分。我从服务器加载我的图像。它工作正常。但我的表视图的问题是,一旦我滚动我的表视图,它就开始闪烁我的图像。这意味着它显示错误的图像一段时间后显示正确的图像。滚动时,此行为会继续。是否需要显式调用任何对象为nil或释放一些单元格对象或持有一些单元格对象。我的表视图单元格如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"MediaContentCell";
MediaContentCell *cell = (MediaContentCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = (MediaContentCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
VideoDataModel *videoData = [_mediaContentArray objectAtIndex:indexPath.row];
cell.mediaTitle.text = videoData.title;
cell.mediaSubtitle.text = videoData.shortdescription;
NSMutableArray *posters = videoData.poster;
dispatch_queue_t myQueue = dispatch_queue_create("ImageQue",NULL);
dispatch_async(myQueue, ^
{
UIImage *image;
if(!posters)
{
image = [UIImage imageNamed:@"dummyprog_large1.png"];
}
else
{
for(int index = 0 ; index < posters.count; index++)
{
PosterDataModel *posterData = [posters objectAtIndex:index];
if([posterData.postertype isEqualToString:POSTER_TYPE_LANDSCAPE])
{
image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:posterData.posterurl]]];
break;
}
}
}
dispatch_async(dispatch_get_main_queue(), ^
{
cell.mediaPicture.image = image;
});
});
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
有没有人可以帮我这个?需要一些帮助谢谢。
答案 0 :(得分:3)
使用 - SDWebImage
[cell.imageView sd_cancelCurrentImageLoad];
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
我正在使用这个框架,它对我来说很好。
答案 1 :(得分:1)
cell.imageView.image = [UIImage imageWithData:yourDefaultImgUrl];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *imageData = [NSData dataWithContentsOfURL:yourServerImageUrl];
if (imageData){
dispatch_async(dispatch_get_main_queue(), ^{
UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath];
if (updateCell)
updateCell.imageView.image = [UIImage imageWithData:imageData];
});
}
});
它可以帮助你:)
答案 2 :(得分:0)
导致问题的重用机制
假设,如果您的表视图有1000个单元格要显示,并且屏幕上一次可以看到5个单元格,iOS将只在内存中创建6个UITableViewCell对象。
在您的代码中,图像将从网络异步加载,然后设置为索引路径上属于单元格的[mediaPicture],但是当您滚动表视图时,由于重用机制,[ cell.mediaPicture]可能与索引路径不正确相关,并且将错误地设置下载的图像。
您可以查看有关重用机制的问题:
UITableViewCell - Understanding "reuseable"
Amol的答案正是您案件的解决方案。