[ios]重新加载动态表格中的 TableViewCell 的 UILabels

发布时间: 2017/3/27 19:53:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我与 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);为 null。为什么呢?

解决方法 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),系统找到 reusableCell 这在 3(indexPath) 中创建。创建以来,它在 3,标签是 3。但你发现的视图中,标记 10,因此结果为空值。

官方微信
官方QQ群
31647020