我正在重写一些代码以提高tableview的性能。我正在尝试实现dequeueReusableCellWithIdentifier,但没有太多运气。
当一个单元格从屏幕上移开并再次打开时,它的内容会重复(每次都会关闭并重新进入屏幕)。当它们不应该出现时,细胞的内容也出现在其他细胞中。
在我看来,当重复使用单元格时,内容需要清除,但我无法弄明白。
单元格本身由4个CUSTOM图像按钮和4个标签组成:
[ ] [ ] [ ] [ ]
abc abc abc abc
某些单元格可能已填充所有这些图像/标签,其他单元格可能只有1或2。
以下代码..
- (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;
}
答案 0 :(得分:1)
您应该致电[b removeFromSuperview]
而不是将其设为nil。
答案 1 :(得分:0)
删除第一个其他条件..