首先,请不要告诉我这是重复的。我知道这个问题已被多次询问和回答,但即使在阅读了其他人的解决方案后,我仍然无法使我的代码工作。
我的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并且必须实例化新单元格时,看起来好像标签显示正确。
如果有人知道为什么会发生这种情况,那么非常感谢帮助。
答案 0 :(得分:1)
我看到了你想要做的几件事。
1)阅读“sizeToFit” - 描述说如果视图没有超级视图,你可能会得到奇怪的结果。
2)创建视图时,立即将其添加到单元格中。
3)在调整单元格大小后,获取其大小,然后计算正确的框架 - 我建议不使用“中心”,但我不知道您的代码不适用于事实。
4)在更改中心以更改框架之前,硬编码如下:
CGRect r = label.frame;
r.origin = (CGPoint){ 20, 20 };
label.frame = r;
这至少会说服你新细胞和旧细胞正常工作。然后你可以计算你真正想要的帧,或者进一步使用中心。
答案 1 :(得分:0)
不确定问题的原因,但您可以进行一些改进。也许其中一个解决了这个问题:
在dequeu方案中,您从视图中删除标签,仅将其添加回来。相反,您应该将其保留在视图层次结构中。
为避免必须一直调整大小并移动标签。为什么不使它足够宽,将文本右对齐。这样,您就不必调整在出列场景中移动标签的大小。
答案 2 :(得分:0)
似乎问题可能在于修改cell.textLabel。本网站上的其他帖子建议,每次修改此标签时,实际上都会创建一个新标签并将其添加到单元格的内容视图中(而不是仅修改现有标签)。设置cell.textLabel.backgroundColor = [UIColor clearColor];
似乎解决了问题
我仍然对此感到困惑,因为即使最后添加我的自定义标签子视图(在设置cell.textLabel的属性之后)也无法解决问题 - 必须将cell.textLabel的背景颜色设置为透明/清除。
答案 3 :(得分: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已启用,否则在将其添加到contentView后需要[标签发布]。