在动态表中重新加载TableViewCell的UILabel

时间:2012-02-20 08:44:16

标签: ios xcode uitableview uilabel

我用UITableView获得了应用程序。

每个UITableViewCell都有UILabel。我以这种方式添加标签:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  //look at the upd
}

但是当我尝试使用其他信息重新加载此表中的数据时,旧的信息(旧标签)不会消失,但仍然在单元格上。

看起来像这样:......

我应该如何组织添加UILabels?

UPD

我以这种方式更正代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Recent Dream";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        UILabel *textLabel = [[UILabel alloc] init];
        textLabel.frame = CGRectMake(10, 0, self.view.frame.size.width -110, 48);
        textLabel.backgroundColor = [UIColor clearColor];
        textLabel.font = [UIFont boldSystemFontOfSize:16];
        [textLabel setTag:(int)indexPath];
        [cell.contentView addSubview:textLabel];


    }
    // Configure the cell...

    Dream *tempDream = [self.dreams objectAtIndex:indexPath.row];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yyyy"];

    //Optionally for time zone converstions
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];

    NSString *stringFromDate = [formatter stringFromDate:tempDream.dateAdd];

    UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"bodyWrapper.png"]];

    cell.contentView.backgroundColor = background;

    UILabel *textLabel = (UILabel *)[cell viewWithTag:(int)indexPath];
    textLabel.text = tempDream.title;

    NSLog(@"%@",tempDream.title);
    NSLog(@"%@",textLabel.text);

    cell.textLabel.text = @"";
    cell.detailTextLabel.text = stringFromDate;

    return cell;
}

输出看起来像这样:

2012-02-20 15:58:10.512 DreamerIOS[3037:10403] lllooooonggg dreeeeeeeaaaaammmm yeeeeeeah
2012-02-20 15:58:10.513 DreamerIOS[3037:10403] (null)
2012-02-20 15:58:10.516 DreamerIOS[3037:10403] dream to end
2012-02-20 15:58:10.516 DreamerIOS[3037:10403] (null)
2012-02-20 15:58:10.519 DreamerIOS[3037:10403] adsfhadskgh dfagfadkuy gadyv dsfdfad fsdf a ghfncdhg hjfg f dfj ghf 
2012-02-20 15:58:10.519 DreamerIOS[3037:10403] (null)

所以,NSLog(@“%@”,tempDream.title);没问题,但NSLog(@“%@”,textLabel.text);一片空白。为什么呢?

2 个答案:

答案 0 :(得分:1)

这是因为每次向单元格添加新标签。

初始化新单元格时,添加标签并为其设置标记

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    //  add label here
    ...
    [label setTag:999];
}

然后在配置单元格时,使用[UIView viewWithTag:]获取标签的引用

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

更新:

您应该为标记使用常量值。如果使用indexPath作为标记,则可能找不到该视图。由于您正在重复使用单元格,因此系统仅创建一定数量的单元格。当单元格不在视图范围内(不可见)时,dequeueReusableCellWithIdentifier将为您获取单元格而不是创建新单元格。

reusableCell是您之前创建的视图。 您为标记使用动态值的情况将如下所示: 您在单元格10(indexPath),系统找到一个在3创建的reusableCell(indexPath)。由于它是在3处创建的,因此标签标签为3.但是您找到带有标签10的视图,因此结果为空。

答案 1 :(得分:1)

这是因为您没有正确重用表视图单元格。 您必须在以下代码块中创建标签
if (cell == nil) {         
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];     
}