UITableViewCell重用和图像重新渲染 [英] UITableViewCell Reuse and Images Re-render

查看:75
本文介绍了UITableViewCell重用和图像重新渲染的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个UITableView,它有18个部分,每个部分有1个标题标题和1个单元格。在每个单元格中,将有一个水平UIScrollView,其中包含多个图像。

I have an UITableView and it has 18 sections, in each section there is 1 title header and 1 cell. In each cell, there will be a horizontal UIScrollView with more than a few images.

问题是......我可以正确加载图像和单元格,但是当图像数量增加并且单元格滚动到顶部时,会有不同的图像单元格在其他单元格中弹出......并且所有渲染和图像都是错误的...应该在第3或第4节中的图像出现在第1节......等等。

Problem is... I can load the images and the cells correctly, but when the image quantity increases and when the cell get scrolled to top, there are images from different cell popping up in other cells... and all the render and images are all wrong... images supposed to be in section 3 or 4 appears in section 1....etc.

数据源是从JSON加载的,而JSON是正确的。当图像不多而且只有5-8个部分时,一切都很完美。因此,它让我相信它是重用UITableViewCell会产生这个问题。

The datasource is loaded from JSON, and the JSON is right. Everything works perfectly when images is not much and with only 5-8 sections. So, it leads me to believe it's the reuse of the UITableViewCell which generates this problem.

有人可以帮我解决这个问题...谢谢..下面是UITableViewCell的代码

Can somebody give me a hand on this... thanks.. below is the code of the UITableViewCell

// Customize the appearance of table view cells.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = nil;

// add a placeholder cell while waiting on table data
if ([self.datasource count] == 0 && indexPath.section == 0 && indexPath.row == 0)
{   
    UILabel *Fetch;
    static NSString *infoCell = @"infoCell";
    cell = [tableView dequeueReusableCellWithIdentifier:infoCell];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                       reuseIdentifier:infoCell] autorelease];   
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        CellFetch = [[[UILabel alloc] initWithFrame:CGRectMake(15.0, 120.0, 280.0, 80.0)] autorelease];
        CellFetch.tag = FETCH_TAG;
        CellFetch.font = [UIFont boldSystemFontOfSize:16.0];
        CellFetch.textColor = [UIColor grayColor];
        CellFetch.shadowColor = [UIColor whiteColor];
        CellFetch.shadowOffset = CGSizeMake(0, -0.5);
        CellFetch.textAlignment = UITextAlignmentCenter;
        [cell.contentView addSubview:CellFetch];
    } else {
        CellFetch = (UILabel *)[cell.contentView viewWithTag:FETCH_TAG];
    }
    Fetch.text = fetchStatus;
    return cell;
} else {
UIScrollView *imgScroll;
static NSString *imgCell = @"imgCell";
cell = [tableView dequeueReusableCellWithIdentifier:imgCell];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:imgCell] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    imgScroll = [[[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320, 108.0)]autorelease];
    imgScroll.tag = SCROLLVIEW_TAG;
    imgScroll.showsVerticalScrollIndicator = NO;
    imgScroll.showsHorizontalScrollIndicator = NO;
} else {
    imgScroll = (UIScrollView *)[cell.contentView viewWithTag:SCROLLVIEW_TAG];
}
    NSArray *sorted = [[self.datasource allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
    //NSArray *allDistrict = [self.datasource allValues];
    NSString *key = [sorted objectAtIndex:indexPath.section];
    NSArray *img = [self.datasource valueForKey:key];

    int column = 0;
    int space = 10;
    int width = 80;
    int x = space+5.0;
    for (NSUInteger i=0; i < img.count; i++) {
        UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
        NSDictionary *Info = [img objectAtIndex:i];
        NSString *iconURL = [NSString stringWithFormat:@"%@",[Info objectForKey:@"ImgURL"]];
        button.frame = CGRectMake(x , 4, 80, 80);
        [button setImageWithURL:[NSURL URLWithString:iconURL] placeholderImage:[UIImage imageNamed:@"pholder"]];
        NSString *imgID = [Info objectForKey:@"ImgID"];
        int k = [imgID intValue];
        button.tag = k; 
        [button addTarget:self action:@selector(onButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        [imgScroll addSubview:button];


        x+=space+width;
        column++;
    }

    [imgScroll setContentSize:CGSizeMake(column*90+10, 108)];

    [cell.contentView addSubview:imgScroll];
}
// Configure the cell...
return cell;

}

推荐答案

尝试让每个部分的单元格标识符都是唯一的,这样它们就不会跨部分重复使用:

Try making your cell identifier unique for each section so that way they won't get reused across sections:

  cell = [tableView dequeueReusableCellWithIdentifier:@"section1cell"];

  cell = [tableView dequeueReusableCellWithIdentifier:@"section2cell"];

我看到某些部分的单元格没有图像的问题,但在其他部分他们是这样。因此,当它重新使用单元格时,除非您专门将图像属性设置为nil ...否则您可以获得之前已编码的图像。

I've seen that problem where cells in certain sections do not have an image, but in other sections they do. So when it reuses the cell, unless you specifically set the image property to nil... you could get an imaged that was previously laoded.

UPDATE:

以下是关于章节编号的内容

Here is what I'm talking about in regards to the section number

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    NSString *section = [NSString stringWithFormat:@"section%@cell", indexPath.section];

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:section];

    // some configuration

    return cell;
}

这篇关于UITableViewCell重用和图像重新渲染的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆