I’m rewriting some code to improve tableview performance. I’m trying to implement the dequeueReusableCellWithIdentifier but not having much luck.
When a cell moves off screen and back on again, it’s contents are duplicated (each time it goes off and back into screen). The contents of the cell are also appearing in other cells when they shouldn’t be.
It seems to me the content needs clearing when the cell is reused but I can’t figure it out.
The cells themselves consist of 4 CUSTOM image buttons and 4 labels, in a row:
[ ] [ ] [ ] [ ]
abc abc abc abc
Some cells might have all these images/labels populated, others might only have 1 or 2.
Code below..
- (UITableViewCell *)tableView:(UITableView *)thetableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//NSString *CellIdentifier = [NSString stringWithFormat:@"Cell",indexPath.section];
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
else
{
//Tried this to clear old contents but doesn't make a difference
for (HomeScreenButton* b in cell.subviews)
{
NSLog(@"RemovedOldButton");
b = nil;
}
for (UILabel* b in cell.subviews)
{
NSLog(@"RemovedOldLabel");
b = nil;
}
}
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
int section = indexPath.section;
NSMutableArray *sectionItems = [sections objectAtIndex:section]; //Gets the array of objects for this section
if (sectionItems.count == 0) return cell;
LepidEntity * le = [sectionItems objectAtIndex:0];// Gets the object for this section (family/group etc.)
if (([le.type isEqualToString:@"family"]) || ([le.type isEqualToString:@"group"]))
{
NSMutableArray * tmpAnn;
int annCount = 0;
//Get annotations for this family/group
if ([le.type isEqualToString:@"family"])
{
Family * family = (Family *)le;
tmpAnn = [[NSMutableArray alloc]initWithArray:family.annotations];
}
else
{
Group * group = (Group *)le;
tmpAnn = [[NSMutableArray alloc]initWithArray:group.annotations];
}
annCount = tmpAnn.count;
//We want to start at the last item in the array. indexPath.row*4. First row would be 0 then 4, then 8 etc.
for (int i = indexPath.row*4;i < tmpAnn.count;i++)
{
Annotation * theAnnotation = [tmpAnn objectAtIndex:i];
CGRect bRect = CGRectMake(i*80, 5, 80, 80);
HomeScreenButton *button = [self getResultsViewButton:bRect imagePath:theAnnotation.image cellForRowAtIndexPath:indexPath i:i entity:theAnnotation];
[button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button];
[button release];
button = nil;
//Get and configure the label
CGRect lRect = CGRectMake(i*80, 80, 100, 16);
UILabel *label = [self getResultsViewLabel:lRect text:theAnnotation.name cellForRowAtIndexPath:indexPath i:i];
[cell.contentView addSubview:label];
[label release];
label = nil;
}
}
else
{
Species * s;
}
return cell;}
-(HomeScreenButton *) getResultsViewButton:(CGRect)rect imagePath:(NSString *)image
cellForRowAtIndexPath:(NSIndexPath *)indexPath i:(int)i entity:(LepidEntity *)entity
{
HomeScreenButton *button=[[HomeScreenButton alloc] initWithFrame:rect];
image = [image stringByReplacingOccurrencesOfString:@"Images/" withString:@"Thumbs/"];
UIImage *buttonImageNormal=[UIImage imageWithContentsOfFile:GetFullPath(image)];//imageNamed:image];
[button setBackgroundImage:buttonImageNormal forState:UIControlStateNormal];
[button setContentMode:UIViewContentModeCenter];
NSString *tagValue = [NSString stringWithFormat:@"%d%d", indexPath.section+1, i];
button.tag = [tagValue intValue];
button.entity = entity;
return button;
}
You should call
[b removeFromSuperview]instead of setting it to nil.