【发布时间】:2011-12-12 15:21:35
【问题描述】:
我正在重写一些代码以提高 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;
}
【问题讨论】:
-
请注意,标签位于图像下方,而不是上图所示的右侧。不知道为什么会这样......
-
自己可能已经解决了这个问题。通过更改: [cell.contentView addSubview:button] 到 [cell addSubview:button]
标签: objective-c ios uitableview