S Arumik
S Arumik

Reputation: 633

UITableViewCell Reuse and Images Re-render

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.

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.

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.

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;

}

Upvotes: 0

Views: 1314

Answers (2)

PJR
PJR

Reputation: 13180

write [cell.contentView addSubview:imgScroll]; in cell == nil part .

like ,

      if (cell == nil) 
{

         cell = [[[UITableViewCell alloc] nitWithStyle: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;
         [cell.contentView addSubview:imgScroll];

}

Upvotes: 0

jerrylroberts
jerrylroberts

Reputation: 3454

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"];

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;
}

Upvotes: 1

Related Questions