我的问题是当我滚动UITableView
单元格图像实际上这些图像在网络服务器和我下载并使用asyncdownloading下载时。我在UIImageView
上添加了UITableViewCell
。图像在UITableViewCell
上成功显示但当我滚动tableview图像时,这是代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DefaultCell"];
searchobjectval =[self.arrSearchResult objectAtIndex:indexPath.row];
if(cell == nil)
{
cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DefaultCell"];
}
UILabel *areaLbl = (UILabel *)[cell viewWithTag:1];
UILabel *postTitle = (UILabel *)[cell viewWithTag:2];
UILabel *roomCost = (UILabel *)[cell viewWithTag:3];
UILabel *description = (UILabel *)[cell viewWithTag:4];
areaLbl.text =searchobjectval.location;
postTitle.text = searchobjectval.title;
roomCost.text = searchobjectval.roomCost;
description.text =searchobjectval.description;
[tableView setSeparatorColor:[UIColor blueColor]];
UIView *myView = [[UIView alloc] init];
if (indexPath.row % 2)
{
UIColor* clr = [UIColor colorWithRed:0.4f green:0.6f blue:0.8f alpha:1];
myView.backgroundColor = clr;
}
else
{
myView.backgroundColor = [UIColor whiteColor];
}
cell.backgroundView = myView;
NSLog(@" search object image %@",searchobjectval.imgLink);
// Pass along the URL to the image (or change it if you are loading there locally)
[AsyncImagesDownloading processImageDataWithURLString:[NSString stringWithFormat: @"http://192.95.48.72/bedspace/new_arrivals_img/%@",searchobjectval.idVal ] andBlock:^(NSData *imageData)
{
if (self.view.window)
{
UIImage *image = [UIImage imageWithData:imageData];
UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
imgVw.image = image;
}
}];
return cell;
}
答案 0 :(得分:2)
对于内存管理目的,UITableView重用其单元格UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DefaultCell"];
,并在向上或向下滚动时加载单元格内容。如果你没有将数据提取到单元格的元素,那么当你向后滚动它时,你将在最后一次使用单元格时获取最后一个值。
在你的情况下:
// Pass along the URL to the image (or change it if you are loading there locally)
[AsyncImagesDownloading processImageDataWithURLString:[NSString stringWithFormat: @"http://192.95.48.72/bedspace/new_arrivals_img/%@",searchobjectval.idVal ] andBlock:^(NSData *imageData)
{
if (self.view.window)
{
UIImage *image = [UIImage imageWithData:imageData];
UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
imgVw.image = image;
}
}];
因此,当!self.view.window
您将拥有最后一次使用该单元格的图像时(if子句返回TRUE),它将在滚动时更改。你需要做的是:
// Pass along the URL to the image (or change it if you are loading there locally)
[AsyncImagesDownloading processImageDataWithURLString:[NSString stringWithFormat: @"http://192.95.48.72/bedspace/new_arrivals_img/%@",searchobjectval.idVal ] andBlock:^(NSData *imageData)
{
if (self.view.window)
{
UIImage *image = [UIImage imageWithData:imageData];
UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
imgVw.image = image;
} else {
UIImage *image = [UIImage imageNamed:@"placeHolder.png"];
UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
imgVw.image = image;
}
}];
希望这显然是有用的:)
答案 1 :(得分:0)
您应该将图片存储为searchobjectval
上的属性,并将其设置在cellForRowAtIndexPath
的图片视图中。异步加载完成后,检查图像的目标单元格是否可见,如果是,则重新加载。如果单元格不可见,您只需等待它再次可见,然后cellForRowAtIndexPath
将为您设置它。
请记住,如果这些图像很大并且self.arrSearchResult
存在很长时间,那么如果图像开始变低,你还应该在其中放置一些逻辑来清除内存中的图像。
答案 2 :(得分:0)
为什么不使用单元格和IB执行此操作cell.yourImageView=[UIImage imageWithData:imageData];
?我认为这个答案很有用https://stackoverflow.com/a/3634414/2000162
答案 3 :(得分:0)
您可以尝试使用apple为图像加载器和文本加载器提供的更好的方法,这将使tableview滚动更快,链接在下面
http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html
答案 4 :(得分:0)
dequeueReusableCellWithIdentifier从队列中获取UITableViewCell对象。从队列中取出时,单元格的内容不会被清除,因此在您的下载完成并且UIImageView的图像被覆盖之前,此单元格可能会显示“错误”的图像。尝试将单元格出列后将图像属性设置为nil,以便在加载新数据之前不显示任何内容。
((UIImageView *)[cell viewWithTag:10]).image = nil;
答案 5 :(得分:0)
这基本上是在请求尚未完成但您已滚动到其他单元格时发生的。由于重用单元格,UITableView会将其视为相同的单元格,并会在显示的单元格上呈现图像。
这是文章 https://medium.com/@bipolarbear/uitableview-with-images-from-api-8902ba507bff
<强>声明:强> 我写了这个博客