iOS:如何正确访问UITableViewCell的contentView上的自定义标签?

我有一个UITableView,每个单元分成几个部分,每个部分都有不同的标签。 该表由NSArray的NSDrayaries填充,其中包含填充单元格标签的所有数据。 UITableView的这部分工作很好。

当我改变其中一个NSDictionaries中的某些值,然后用更新的NSArray重新加载表时,就会出现问题。 通常,当我调用[myTableView reloadData]; 即使(通过debugging)我可以看到更新的数据正在处理更新没有更新。 但是,如果我改变标准: if (cell == nil) { to if (1) { ,在cellForRowAtIndexPath方法中,那么它的工作原理非常漂亮。 我明白为什么if(1) {工作,但我不明白为什么我不能重用单元格,只是改变标签文本。

为什么if (cell == nil)不起作用? 重新初始化每个单元是否是巨大的资源消耗?

码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"myCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier]; if (/*cell == nil*/1) { // Initialize Custom Cell cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; //// Background View cellBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 622, 43)]; [cellBackgroundView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"Images/Library/phase_table_cell.png"]]]; //// Name Label nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 250, 18)]; [nameLabel setBackgroundColor:[UIColor clearColor]]; [cellBackgroundView addSubview:nameLabel]; //// Percent Complete Label percentCompleteLabel = [[UILabel alloc] initWithFrame:CGRectMake(300, 10, 30, 18)]; [percentCompleteLabel setBackgroundColor:[UIColor clearColor]]; [percentCompleteLabel setTextAlignment:UITextAlignmentCenter]; [cellBackgroundView addSubview:percentCompleteLabel]; //// Overall Status Label overallStatusLabel = [[UILabel alloc] initWithFrame:CGRectMake(352, 7, 63, 30)]; [overallStatusLabel setBackgroundColor:[UIColor clearColor]]; [overallStatusLabel setFont:[UIFont boldSystemFontOfSize:12.0]]; [overallStatusLabel setLineBreakMode:UILineBreakModeWordWrap]; [overallStatusLabel setNumberOfLines:2]; [overallStatusLabel setTextAlignment:UITextAlignmentCenter]; [cellBackgroundView addSubview:overallStatusLabel]; //// Finish Date Label finishDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(425, 10, 55, 18)]; [finishDateLabel setBackgroundColor:[UIColor clearColor]]; [finishDateLabel setTextAlignment:UITextAlignmentCenter]; [finishDateLabel setFont:[UIFont systemFontOfSize:12.0]]; [cellBackgroundView addSubview:finishDateLabel]; //// Overall Weight Label overallWeightLabel = [[UILabel alloc] initWithFrame:CGRectMake(505, 10, 30, 18)]; [overallWeightLabel setBackgroundColor:[UIColor clearColor]]; [overallWeightLabel setTextAlignment:UITextAlignmentCenter]; [cellBackgroundView addSubview:overallWeightLabel]; //// Green Risk View greenRiskView = [[UIView alloc] initWithFrame:CGRectMake(557, 4, 61, 10)]; [greenRiskView setBackgroundColor:[UIColor greenColor]]; [greenRiskView setHidden:YES]; [cellBackgroundView addSubview:greenRiskView]; //// Yellow Risk View yellowRiskView = [[UIView alloc] initWithFrame:CGRectMake(557, 17, 61, 10)]; [yellowRiskView setBackgroundColor:[UIColor yellowColor]]; [yellowRiskView setHidden:YES]; [cellBackgroundView addSubview:yellowRiskView]; //// Red Risk View redRiskView = [[UIView alloc] initWithFrame:CGRectMake(557, 30, 61, 10)]; [redRiskView setBackgroundColor:[UIColor redColor]]; [redRiskView setHidden:YES]; [cellBackgroundView addSubview:redRiskView]; [cell.contentView addSubview:cellBackgroundView]; } // Get Current Dictionary NSDictionary *dictForIndexPath = [self.phaseArray objectAtIndex:[indexPath row]]; // Set Elements [nameLabel setText:[dictForIndexPath objectForKey:@"name"]]; [percentCompleteLabel setText:[dictForIndexPath objectForKey:@"percentComplete"]]; [overallStatusLabel setText:[dictForIndexPath objectForKey:@"overallStatus"]]; [overallWeightLabel setText:[[NSNumber numberWithInt:[[dictForIndexPath objectForKey:@"overallWeight"] intValue]] stringValue]]; //// Create Finish Date String NSString *finishDateString = [NSString stringWithFormat:@"%@/%@/%@", [dictForIndexPath objectForKey:@"finishDay"], [dictForIndexPath objectForKey:@"finishMonth"], [dictForIndexPath objectForKey:@"finishYear"]]; [finishDateLabel setText:finishDateString]; //// Pick Risk View NSString *riskColor = [dictForIndexPath objectForKey:@"riskColor"]; if ([riskColor isEqualToString:@"Green"]) { [greenRiskView setHidden:NO]; [yellowRiskView setHidden:YES]; [redRiskView setHidden:YES]; } else if ([riskColor isEqualToString:@"Yellow"]) { [greenRiskView setHidden:YES]; [yellowRiskView setHidden:NO]; [redRiskView setHidden:YES]; } else { [greenRiskView setHidden:YES]; [yellowRiskView setHidden:YES]; [redRiskView setHidden:NO]; } return cell; } 

可能你是在if(cell==nil)块内赋值的? 只有初始化应该在该块内发生。 移动其余的部分。 (发布完整的cellForRow代码,如果你需要更多的帮助)

//编辑:现在,你发布你的代码后,我看到你的问题:

你将所有的标签和视图存储在成员variables中..但当然只有当if(cell != nil)块被执行时才会发生。 之后,你总是访问同一个单元格(最后分配的)。 所以你至less要更新一个单元格;)

要解决您的问题,例如使用标签来从单元格中获取相应的视图。 我将显示它为您的backgroundView,但你必须做你的所有意见(INSTEAD的成员variables,删除它们)。

 static NSString *cellIdentifier = @"myCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier]; if (cell == nil) { //// Background View UIView* cellBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 622, 43)]; cellBackgroundView.tag = 1; [cellBackgroundView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"Images/Library/phase_table_cell.png"]]]; } // get the backgroundview from the current cell UIView* backgroundView = [cell.contentView viewWithTag: 1]; 

等等..