iOS xcode,将UILabel子视图添加到自定义表格单元格,标签文本不会在屏幕上更新

时间:2011-09-13 07:48:04

标签: ios uitableview uilabel

我创建了一个自定义的UITableViewCell类,并使用layoutSubviews方法添加自定义标签。像这样:

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (statusLabel == nil)
    {
        statusLabel = [[UILabel alloc]initWithFrame:CGRectMake(430.0, 10.0, 100.0, 20.0)];
        [statusLabel setTextAlignment:UITextAlignmentRight];
        [statusLabel setText:@"Status, set in code"];
        statusLabel.tag = 1;

        [self.contentView addSubview:statusLabel];
    }        
}

如您所见,我已将标签的初始文本设置为“状态,在代码中设置”。

在表视图控制器中,我在cellForRowAtIndexPath方法中设置了此自定义标签的文本,如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    int index = [indexPath row];

    NSString *introducerString =[introducers objectAtIndex:index];
        NSArray *parts = [introducerString componentsSeparatedByString:@","];

    static NSString *MyIdentifier = @"Requester";
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) 
    {
        cell = [[[DanceCardCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                       reuseIdentifier:MyIdentifier] autorelease];
    }

    UIImage *image = [UIImage imageNamed:@"1.jpg"];
    [cell.imageView setImage:image];
    cell.textLabel.text = [parts objectAtIndex:1];
    cell.detailTextLabel.text = @"Some text";

    UILabel *statusLabel = (UILabel *)[cell viewWithTag:1];
    statusLabel.text = @"Did it!";

    return cell;
}

我正在使用一个表视图来显示两个列表,具体取决于按下两个按钮中的哪一个。按下按钮时,相应的表视图控制器将附加到表视图,并调用reloadData方法以触发新数据的显示。新数据会显示,但自定义标签文本应显示为“Did it!”读取“状态,设置为代码...”,直到我再次切换列表两次。

如何让自定义标签的新文字立即更新?我检查了官方文档,在更新其自定义内容后找不到任何有关刷新单元格显示的参考。

以下是展示所发生情况的屏幕截图:http://www.dsbsystems.co.uk/images/xcode1.png

1 个答案:

答案 0 :(得分:2)

您正在初始化单元格并立即尝试在其中找到带有标记1的statusLabel。 layoutSubviews尚未有机会被调用,因此标签尚未创建和添加。 (我建议在表视图单元格上覆盖指定的初始化方法并在那里创建标签。)

因此,当你试图提取statusLabel时,它变为nil,因为没有这样的视图,并且消息(调用方法)nil什么都不做(实际上,它返回nil )。如果你已经习惯了爆炸的事情,你将需要注意这一点。空引用异常。

当再次请求单元格时,不需要新单元格,因为它可以从重用队列中获得,并且可以正确找到标签。