重新加载时,UILabel 在 UITableViewCell 中不刷新
Posted
技术标签:
【中文标题】重新加载时,UILabel 在 UITableViewCell 中不刷新【英文标题】:UILabel not refreshing in UITableViewCell when reloaded 【发布时间】:2011-03-14 12:34:06 【问题描述】:我将两个UILabels
添加到UITableViewCell
,然后将名称和数字标签添加到该单元格。当我重新加载UITableView
中的数据时(无论是从表格视图中添加还是删除联系人),标签中的数据是重叠的,这意味着它不会重新加载标签,直到重新加载整个视图。
有人可以帮忙吗?
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UILabel *name;
UILabel *number;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
//NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
// NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
// [sortDescriptor release];
CGRect Label1Frame = CGRectMake(10, 10, 140, 25);
name = [[UILabel alloc] initWithFrame:Label1Frame];
name.tag = 1;
[name setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:name];
CGRect Label2Frame = CGRectMake(150, 10, 140, 25);
number = [[UILabel alloc] initWithFrame:Label2Frame];
number.tag = 1;
[number setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:number];
name.text = [NSString stringWithFormat:@"%@",[names objectAtIndex:indexPath.row]];
number.text = [NSString stringWithFormat:@"%@",[phonenumbers objectAtIndex:indexPath.row]];
[name release];
[number release];
return cell;
【问题讨论】:
【参考方案1】:您应该将标签创建代码移动到单元初始化中,然后稍后通过标记引用它们,如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
//NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
// NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
// [sortDescriptor release];
CGRect Label1Frame = CGRectMake(10, 10, 140, 25);
UILabel *name = [[UILabel alloc] initWithFrame:Label1Frame];
name.tag = 1;
[name setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:name];
[name release];
CGRect Label2Frame = CGRectMake(150, 10, 140, 25);
UILabel *number = [[UILabel alloc] initWithFrame:Label2Frame];
number.tag = 2;
[number setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:number];
[number release];
UILabel *nameLabel = (UILabel *)[cell viewWithTag:1];
UILabel *numberLabel = (UILabel *)[cell viewWithTag:2];
name.text = [NSString stringWithFormat:@"%@",[names objectAtIndex:indexPath.row]];
number.text = [NSString stringWithFormat:@"%@",[phonenumbers objectAtIndex:indexPath.row]];
return cell;
【讨论】:
太棒了!至少为我节省了几个小时(在浪费了几个小时试图解决它之后......)。在我的情况下,我在if (cell == nil)
测试之前声明了 UILabel(和按钮),然后在该测试中添加到单元格中。那没用,所以我很高兴找到这个:)【参考方案2】:
您没有正确地重复使用您的 UITableViewCell 对象,您只需要为每个需要创建的单元格分配和设置一次 UILabel 对象。如果一个单元格已经存在并且可以重复使用,那么您只需要检索所需的 UILabel 对象并修改每个单元格的 text 属性:
我建议阅读以下内容:
UITableView class reference
【讨论】:
您的代码将失败并导致内存泄漏。第二个单元格不会将名称或数字标签分配给任何内容,因为您仅在单元格初始化中设置这些标签,您也根本不会释放这些标签。 OP 也没有发布 UILabel 的文本属性,而是 UILabel 本身。 道歉@theChrisKent,绝对正确,我误读了这个问题。已编辑,您的正确答案已投赞成票。 别担心,我们都做到了。我想这就是为什么你没有收到我的反对票。我们都只是想提供帮助,感谢您的支持:) @theChrisKent,当然,感谢您对否决按钮的理解和克制;-)【参考方案3】:最简洁的方法是创建自定义表格视图单元格并仅在CellForRowAtIndexPath
方法中设置标签值。
这样可以确保最有效地使用和重用UITableViewCell
s。
【讨论】:
以上是关于重新加载时,UILabel 在 UITableViewCell 中不刷新的主要内容,如果未能解决你的问题,请参考以下文章