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

时间:2012-03-25 21:14:49

标签: objective-c ios uitableview

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

当我更改其中一个NSDictionaries中的某些值然后使用更新的NSArray重新加载表时,会出现问题。通常,当我调用[myTableView reloadData];时,即使(通过调试)也没有更新任何内容,我可以看到正在处理的更新数据。但是,如果我将标准if (cell == nil) {更改为if (1) {,则在cellForRowAtIndexPath方法中,它可以很好地工作。我理解为什么if(1) {有效,但我不明白为什么我不能重复使用单元格而只是更改标签文本。

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

CODE:

- (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;
}

1 个答案:

答案 0 :(得分:3)

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

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

您将所有标签和视图存储在成员变量中..但当然只有在执行if(cell != nil)块时才会发生这种情况。之后,您始终访问相同的单个单元格(最后分配)。所以你要更新至少一个单元格;)

要解决您的问题,请执行以下操作:带有标签,可以从单元格中获取相应的视图。我将为您的backgroundView显示它,但您必须为所有视图执行此操作(成员变量的INSTEAD。删除它们。)

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];

依旧......