iOS:如何正确访问UITableViewCell的contentView上的自定义标签? [英] iOS: How to access custom labels on the contentView of an UITableViewCell correctly?

查看:54
本文介绍了iOS:如何正确访问UITableViewCell的contentView上的自定义标签?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个UITableView,每个单元格分为几个部分,每个部分带有不同的标签.该表由NSDictionaries的NSArray填充,该NSArray包含填充单元格标签的所有数据. UITableView的这一部分效果很好.

I have a UITableView with each cell being broken into several sections with a different label in each section. The table gets populated by an NSArray of NSDictionaries which contain all the data that populates the cell's labels. This part of the UITableView works great.

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

The problem arises when I change some of the values in one of the NSDictionaries and then reload the table with the updated NSArray. Normally, when I call [myTableView reloadData]; nothing is updated even though (through debugging) I can see the updated data being processed. But if I change the standard: if (cell == nil) { to if (1) {, in the cellForRowAtIndexPath method, then it works beautifully. I understand why if(1) { works but I do not understand why I cannot reuse the cells and just change the label text.

为什么if (cell == nil)不起作用?重新初始化每个单元格是否会浪费大量资源?

Why does if (cell == nil) not work? Is it a huge resource drain to re-initialize each cell?

代码:

- (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代码)

Probably you are assigning the value within the if(cell==nil) block? Only the initialization should happen within that block. Move the rest out of it. (Post your complete cellForRow code, if you need more help)

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

//edit: now, after you posted your code i see your problem:

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

you are storing all your labels and views in member variables.. but of course that only happens, when the if(cell != nil) block is executed. After that, you always access the same single cell (that was assigned last). So you are updating at least one cell ;)

要解决您的问题,请进行例如带有标记,以从单元格中获取对应的视图.我将为您的backgroundView显示它,但您必须对所有视图都进行此操作(删除成员变量.删除它们.)

To fix your problem, work e.g. with tags to get your corresponding views back from the cell. I will show it for your backgroundView, but you have to do it for all of your views (INSTEAD of the member variables. Remove them.)

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

以此类推.

这篇关于iOS:如何正确访问UITableViewCell的contentView上的自定义标签?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆