单元格图像更改滚动UITableView
嗨,我的问题是,当我滚动UITableView
细胞图像实际上这些图像是在web服务器和我并使用asyncdownloading下载它。我在UITableViewCell
上添加了UIImageView
。图像成功地显示在UITableViewCell
但是当我滚动的tableview图像的变化是这样的代码单元格图像更改滚动UITableView
- (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;
}
您应该将图像存储为上searchobjectval
一个属性,并将其设置在cellForRowAtIndexPath
图像视图。当异步加载完成时,检查图像的目标单元格是否可见,如果是,则重新加载它。如果单元格不可见,则可以等待它再次变为可见,然后cellForRowAtIndexPath
将为您设置它。
请记住,如果这些图像很大并且self.arrSearchResult
存在很长时间,那么您应该在其中放置一些逻辑以清除内存中的图像,如果它开始变慢。
为什么不使用单元格和IB做这个cell.yourImageView=[UIImage imageWithData:imageData];
?我想这个答案是非常有用的https://*.com/a/3634414/2000162
您可以尝试通过苹果的图像加载器和文本装载机,这将使tableview中滚动更快的链接给出一个更好的办法是低于
http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html
对于内存管理目的的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
你就会有个最后使用单元格的图像(如果子句返回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;
}
}];
希望这是明确的有用:)
dequeueReusableCellWithIdentifier需要一个UITableViewCell对象从队列中。从队列中取出时单元格的内容不会被清除,因此该单元格可能会显示一个“错误”的图像,直到您的下载完成并且您的UIImageView的图像被覆盖。尝试设置图像属性为零后离开单元格,以便在加载新数据之前不显示任何内容。
((UIImageView *)[cell viewWithTag:10]).image = nil;
这基本上发生在请求尚未完成但您已滚动到其他单元格时。由于重用单元格,UITableView会将其视为同一个单元格,并将显示单元格上的图像。
这里的文章 https://medium.com/@bipolarbear/uitableview-with-images-from-api-8902ba507bff
免责声明: 我写这篇博客
对从内存清除图像扩大,'NSCache'会是一个更好的存储类;那么你不需要编写任何逻辑。或者更好,不要重新发明*,并使用SDWebImage。 – 2013-05-13 14:09:28