我正在尝试创建一个UITableView。但是我的表错误是,当它滚动时(当一个单元隐藏然后再显示自己时)它会重置选项卡并再次从服务器加载图像。如何使其不加载图像或保留前一个单元格
static NSString *myIdentifier = @"myIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier];
backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 300, 62)];
userDp = [[UIImageView alloc] initWithFrame:CGRectMake(11, 10, 50, 50)];
name = [[UILabel alloc] initWithFrame:CGRectMake(67, 12, 176, 20)];
name.font = [UIFont fontWithName:@"HelveticaLTStd-Bold" size:12];
CustomActivityViewer *imgIndicator = [[CustomActivityViewer alloc] initWithView:userDp];
[imgIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{
UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", IMAGE_URL, player.imagePath]]]];
dispatch_async(dispatch_get_main_queue(), ^{
[imgIndicator stopAnimating];
if (img != nil)
userDp.image = img;
[imgIndicator stopAnimating];
});
});
[name setShadowColor:[UIColor blackColor]];
[name setShadowOffset:CGSizeMake(1, 1)];
name.textColor = [UIColor colorWithRed:1.0 green:0.824 blue:0 alpha:1.0];
cell.accessoryType = UITableViewCellAccessoryNone;
[cell setSelectionStyle:UITableViewCellEditingStyleNone];
cell.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:backImage];
[cell.contentView addSubview:userDp];
[cell.contentView addSubview:name];
return cell;
}
如果我放置if(cell!= nil)则细胞会自行重复。
怎么办?
P.S在iPhone自己的一个教程中,我看到了像带有标签的cell.contentView设置项,然后如果单元格不是nil则用标签调用视图。我没找到那个教程。只要有人知道
答案 0 :(得分:1)
如果您不想每次都重新加载图片,只需缓存图片即可。周围有很多选项,其中一个是NSCache或SDWebImage
答案 1 :(得分:1)
我不推荐这个:
您可以(但不应该)创建自己的单元格数组,其中包含与表中的行一样多的对象。然后在cellForRowAtIndexPath中,您可以简单地返回相应的单元格而不是重用它们。 从技术上讲,这没有任何问题。
对于两把细胞,这应该没问题。但是,当表变大时,这个概念几乎肯定会导致内存问题。
您还可以维护一组(异步加载的)图像,正确地重用单元格并返回到cellForRowAtIndexPath
的图像数组。但是,对于内存问题,这不会做太多改变,因为这会为单元视图和子视图等节省内存,但通常图像数据本身非常耗费内存。
对于未指定数量的行,可能取决于用户或业务数据等,并且不受限制,除了一些更智能的缓存解决方案之外别无选择。