Objective c UILabel子视图缓存问题的UITableViewCell

Objective c UILabel子视图缓存问题的UITableViewCell,objective-c,ios,uitableview,uilabel,Objective C,Ios,Uitableview,Uilabel,首先,请不要告诉我这是复制品。我知道这个问题已经被问过很多次了,也被回答过很多次了,但即使在阅读了其他人的解决方案之后,我仍然无法让我的代码正常工作 我的UITableViewCell包含UILabel子视图时出现问题。UILabel有时不会出现在某些单元格中,直到我滚动离开这些单元格并返回到它们。以下是我用于自定义单元格的代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIn

首先,请不要告诉我这是复制品。我知道这个问题已经被问过很多次了,也被回答过很多次了,但即使在阅读了其他人的解决方案之后,我仍然无法让我的代码正常工作

我的UITableViewCell包含UILabel子视图时出现问题。UILabel有时不会出现在某些单元格中,直到我滚动离开这些单元格并返回到它们。以下是我用于自定义单元格的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

UILabel *label;

if (cell == nil) {

    // cell is nil, create it

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];


    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
    label.tag = 888;

} else {

    label = (UILabel*)[cell.contentView viewWithTag:888];
    [label removeFromSuperview];

}

label.text = @"Label Text";
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
[cell.contentView addSubview:label];

// customize cell text label
cell.textLabel.text = @"Cell Text";
cell.textLabel.textColor = [UIColor darkGrayColor];

return cell;
}
当dequeueReusableCellWithIdentifier:CellIdentifier返回非nil值时,标签似乎正确显示,但如果返回值为nil且必须实例化新单元格,则标签不会显示


如果有人知道为什么会发生这种情况,我们将非常感谢您的帮助。

我看到了一些您想做的事情

1) 仔细阅读“sizeToFit”——描述中说,如果视图没有superview,您可能会得到奇怪的结果

2) 创建视图时,请立即将其添加到单元中

3) 调整单元格大小后,获取其大小,然后计算适当的帧-我建议不要使用“中心”,但我不知道您的代码是否适用

4) 在将中心更改为更改帧之前,硬编码如下:

CGRect r = label.frame;
r.origin = (CGPoint){ 20, 20 };
label.frame = r;

这至少会让你相信新电池和旧电池都能正常工作。然后你可以计算出你真正想要的帧,或者进一步使用中锋。

我看到了一些你想要做的事情

1) 仔细阅读“sizeToFit”——描述中说,如果视图没有superview,您可能会得到奇怪的结果

2) 创建视图时,请立即将其添加到单元中

3) 调整单元格大小后,获取其大小,然后计算适当的帧-我建议不要使用“中心”,但我不知道您的代码是否适用

4) 在将中心更改为更改帧之前,硬编码如下:

CGRect r = label.frame;
r.origin = (CGPoint){ 20, 20 };
label.frame = r;

这至少会让你相信新电池和旧电池都能正常工作。然后你可以计算出你真正想要的帧,或者进一步使用中锋。

不确定问题的原因,但是你可以做一些改进。也许其中一个解决了这个问题:

  • 在dequeu场景中,从视图中删除标签,然后再添加回来。相反,您应该将其保留在视图层次结构中

  • 以避免必须始终调整标签的大小和移动标签。为什么不让它足够宽,将文本右对齐。这样,您就不必在出列场景中调整移动标签的大小


  • 不确定问题的原因,但您可以做一些改进。也许其中一个解决了这个问题:

  • 在dequeu场景中,从视图中删除标签,然后再添加回来。相反,您应该将其保留在视图层次结构中

  • 以避免必须始终调整标签的大小和移动标签。为什么不让它足够宽,将文本右对齐。这样,您就不必在出列场景中调整移动标签的大小


  • 似乎问题可能在于修改cell.textLabel。该站点上的其他帖子建议,每当修改此标签时,实际上会创建一个新标签并将其添加到单元格的contentview中(而不仅仅是修改现有标签)。设置
    cell.textLabel.backgroundColor=[UIColor clearColor]似乎已经解决了问题


    尽管如此,我还是有点困惑,因为即使最后添加我的自定义标签子视图(在设置cell.textLabel的属性之后)也不能解决问题-cell.textLabel的背景色必须设置为透明/透明。

    似乎问题可能出在修改cell.textLabel上。该站点上的其他帖子建议,每当修改此标签时,实际上会创建一个新标签并将其添加到单元格的contentview中(而不仅仅是修改现有标签)。设置
    cell.textLabel.backgroundColor=[UIColor clearColor]似乎已经解决了问题


    我对此仍然有点困惑,因为即使最后添加我的自定义标签子视图(在设置cell.textLabel的属性后)也不能解决问题-cell.textLabel的背景色必须设置为透明/透明。

    有三件事不合适:

    if (cell == nil) { // cell is nil, create it
    
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];
    
        label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
        label.tag = 888;
        [cell.contentView addSubview:label]; // (1) DO THIS HERE
    
    } else {
    
        label = (UILabel*)[cell.contentView viewWithTag:888];
        // (2) DON'T DO THIS:  [label removeFromSuperview];
    
    }
    
    label.text = @"Label Text";
    label.backgroundColor = [UIColor clearColor];
    [label sizeToFit];
    label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
    // (3) DON'T DO THIS HERE: [cell.contentView addSubview:label];
    ....
    

    我假设ARC已打开,否则在将其添加到contentView后需要[label release]。

    有三件事不合适:

    if (cell == nil) { // cell is nil, create it
    
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];
    
        label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
        label.tag = 888;
        [cell.contentView addSubview:label]; // (1) DO THIS HERE
    
    } else {
    
        label = (UILabel*)[cell.contentView viewWithTag:888];
        // (2) DON'T DO THIS:  [label removeFromSuperview];
    
    }
    
    label.text = @"Label Text";
    label.backgroundColor = [UIColor clearColor];
    [label sizeToFit];
    label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
    // (3) DON'T DO THIS HERE: [cell.contentView addSubview:label];
    ....
    

    我假设ARC已打开,否则在将[label release]添加到contentView后需要[label release]。

    您好,我不明白您为什么要创建新标签并插入它们。基本方法是在编辑器或代码中准备一个单元格并重用它。而重用意味着干净和格式化,甚至不重新排列找到的单元格。所以对我来说,你似乎是在浪费资源。我建议您在编辑器板中准备一个自定义单元格,将其分配给一个类并重用它。或者你重新安排标签的原因是什么?我不确定我是否理解你的意思。我正在尝试将标签添加到表格单元格的最右侧(与单元格的textLabel属性分离),每次出现表格视图时,标签文本都可能更改。您好,我不明白您为什么要创建新标签并插入它们。基本方法是在编辑器或代码中准备一个单元格并重用它。而重用意味着干净和格式化,甚至不重新排列找到的单元格。所以对我来说,你似乎是在浪费资源。我建议您在编辑器板中准备一个自定义单元格,将其分配给一个类并重用它。或者你重新安排标签的原因是什么?我不确定我是否理解你的意思。我正在尝试将标签添加到表格单元格的最右侧(与单元格的textLabel属性分开),并且标签文本可能会在每次打开表格视图时更改