在我的iPhone应用程序中,我正在使用带有自定义单元格的UITableView。这些单元格包含不同的标签,主要只是表示文本。但我使用其中一个标签作为某种状态指示器,给它不同的颜色。 由于滚动变得很慢,我想重用细胞。这样做会给我带来良好的性能提升,但“状态标签”显示错误。对于不同的单元格,颜色不再正确(所有其他标签都是正确的)。
任何人都遇到过这样的问题,可以给我一个暗示吗?
编辑: 自定义tablecell的代码
- (void)setIncident:(Incident *)_incident{
[self setSelectionStyle:UITableViewCellEditingStyleNone];
incident = _incident;
streamNameLbl.text = incident.streamName;
jobNameLbl.text = incident.jobName;
workInProgressByLbl.text = incident.workInProgressBy;
NSDateFormatter *tempFormatter = [[NSDateFormatter alloc] init];
[tempFormatter setDateFormat:@"hh:mm"];
errorTimeLbl.text = [NSString stringWithFormat:@"%@", [tempFormatter stringFromDate:incident.errorTime]];
[tempFormatter setDateFormat:@"dd. MMM"];
plandateLbl.text = [NSString stringWithFormat:@"%@", [tempFormatter stringFromDate:incident.planDate]];
returnCodeLbl.text = [@"RC: " stringByAppendingString: incident.returnCode];
runNumberLbl.text = [@"Run: " stringByAppendingString: incident.runNumber];
severityLbl.text = incident.severity;
restartStatusLblValue.text = incident.restartStatus;
NSString * color = incident.severityColor;
NSString * colorR = [color substringWithRange:NSMakeRange(1, 2)];
NSString * colorG = [color substringWithRange:NSMakeRange(3, 2)];
NSString * colorB = [color substringWithRange:NSMakeRange(5, 2)];
unsigned intColorR = 0;
unsigned intColorG = 0;
unsigned intColorB = 0;
NSScanner *scanner = [NSScanner scannerWithString:colorR];
[scanner scanHexInt:&intColorR];
scanner = [NSScanner scannerWithString:colorG];
[scanner scanHexInt:&intColorG];
scanner = [NSScanner scannerWithString:colorB];
[scanner scanHexInt:&intColorB];
incidentStatusLbl.backgroundColor = [UIColor clearColor];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = incidentStatusLbl.bounds;
gradient.startPoint = CGPointMake(0, 0.5);
gradient.endPoint = CGPointMake(1, 0.5);
UIColor * startColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
UIColor * endColor = [UIColor colorWithRed:intColorR/255.0 green:intColorG/255.0 blue:intColorB/255.0 alpha:1];
gradient.colors = [NSArray arrayWithObjects:(id)[startColor CGColor], (id)[endColor CGColor], nil];
[incidentStatusLbl.layer insertSublayer:gradient atIndex:0];
}
UITableView中的cellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
incidentCell = (IncidentCell *)[tableView dequeueReusableCellWithIdentifier:@"IncidentCell"];
if (incidentCell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"IncidentCell" owner:self options:nil];
incidentCell = [nib objectAtIndex:0];
NSLog(@"Loading cell from xib file");
}
else{
NSLog(@"Reusing cell");
}
NSMutableArray *sectionDetails = ((NSMutableArray *)[incidentDic objectForKey:[self.sortedSections objectAtIndex:[indexPath section]]]);
Incident *incident = [sectionDetails objectAtIndex:[indexPath row]];
[incidentCell setIncident:incident];
return incidentCell;
}
答案 0 :(得分:3)
当您重复使用单元格时,在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中询问单元格时,它不会从您的笔尖重新加载。
因此,如果您在笔尖中将标签颜色设置为黑色,并且您在代码中执行
if (some_condition) {
cell.myLabel.textcolor= myStatusColor;
}
当标签具有myStatusColor颜色一次时,它将在您重复使用时保留它。
所以你必须这样做
if (some_condition) {
cell.myLabel.textcolor= myStatusColor;
} else {
cell.myLabel.textcolor= [UIColor black];
}
事实上,您的问题来自[incidentStatusLbl.layer insertSublayer:gradient atIndex:0];
如果你使用它一次,你将有一个subLayer,(我们称之为subLayer1)。当您重复使用单元格时,您将在索引0,BEHIND subLayer1处添加另一个子图层。您可能希望之前删除旧的自定义subLayer。