UITableViewCell在滚动后重新加载

时间:2013-04-11 08:37:23

标签: objective-c cocoa-touch uitableview

我正在尝试创建一个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则用标签调用视图。我没找到那个教程。只要有人知道

2 个答案:

答案 0 :(得分:1)

如果您不想每次都重新加载图片,只需缓存图片即可。周围有很多选项,其中一个是NSCache或SDWebImage

答案 1 :(得分:1)

推荐这个:

您可以(但不应该)创建自己的单元格数组,其中包含与表中的行一样多的对象。然后在cellForRowAtIndexPath中,您可以简单地返回相应的单元格而不是重用它们。 从技术上讲,这没有任何问题。

对于两把细胞,这应该没问题。但是,当表变大时,这个概念几乎肯定会导致内存问题。

您还可以维护一组(异步加载的)图像,正确地重用单元格并返回到cellForRowAtIndexPath的图像数组。但是,对于内存问题,这不会做太多改变,因为这会为单元视图和子视图等节省内存,但通常图像数据本身非常耗费内存。

对于未指定数量的行,可能取决于用户或业务数据等,并且不受限制,除了一些更智能的缓存解决方案之外别无选择。