重新加载时,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 方法中设置标签值。 这样可以确保最有效地使用和重用UITableViewCells。

【讨论】:

以上是关于重新加载时,UILabel 在 UITableViewCell 中不刷新的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 的背景颜色在重新加载表后变得清晰

swift - 在不重新加载自定义 UITableViewCell 的情况下设置 UILabel

Swift 懒加载

Miles Away 没有在重新加载时更新

保存 UILabel 信息?

重新加载 UITableview 时出现问题..!