2012-07-19 78 views
1

首先,请不要告诉我这是重复的。我知道这个问题已经被多次询问和回答,但即使在阅读其他人的解决方案之后,我仍然无法让我的代码正常工作。UITableViewCell与UILabel子视图缓存问题

我遇到了一个包含UILabel子视图的UITableViewCell问题。 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返回非零值,但不露面,如果返回值是零和一新单元必须实例化。

如果有人有一个想法,为什么这可能会发生,帮助将不胜感激。

+0

嗨,我不明白你为什么要创建新的标签,并插入它们。基本的方法是在编辑器或代码中准备一个单元格并重用它。虽然重用意味着干净和格式化,但不会重新排列甚至找到的单元格。所以对我来说,你似乎在浪费资源。我建议你在编辑板中准备一个自定义单元格,并将其分配给一个类并重用。或者您是否有重新安排标签的具体原因? – iOS 2012-07-19 21:27:27

+0

我不知道我明白你在说什么。我正在尝试向表格单元格的最右侧添加一个标签(与单元格的textLabel属性分开),并且标签文本可能会在每次出现表格视图时更改。 – stackunderflow 2012-07-19 22:12:13

回答

0

看来这个问题可能与修改cell.textLabel有关。本网站上的其他帖子建议,只要修改此标签,实际上就会创建一个新标签并将其添加到单元格的contentview中(与仅修改现有标签相反)。设置cell.textLabel.backgroundColor = [UIColor clearColor];似乎已经解决了问题

我还是有点困惑,虽然因为即使添加我的自定义标签子视图最后(设置属性为cell.textLabel后)没有解决问题 - 的背景色cell.textLabel必须设置为透明/清除。

1

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

1)阅读“sizeToFit” - 描述说,如果视图没有超视图,你可能会得到奇怪的结果。

2)创建视图时,立即将其添加到单元格中。 3)调整单元格大小后,获取其大小,然后计算适当的框架 - 我建议不要使用“中心”,但我不知道你的代码不适用于事实。

4)之前,甚至改变中心不断变化的框架,硬代码是这样的:

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

这将至少让你相信新的细胞和旧细胞的正常工作。然后你可以计算你真正想要的框架,或者进一步玩中心。

0

不确定问题的原因,但您可以进行一些改进。也许他们中的一个修复该问题:

  1. 在dequeu情况下,您从视图中删除的标签,只有重新添加。相反,您应该将其保留在视图层次结构中。

  2. 为了避免不得不一直调整大小和移动标签。为什么不把它放到足够宽的地方,将文本右对齐。这样,您不必调整在出列情况下移动标签的大小。

0

有三样东西出来的地方:

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是对的,否则你需要将它添加到内容查看后[标签释放。