UITableView自定义单元格不刷新

时间:2012-09-01 22:22:22

标签: ios uitableview

关于刷新自定义表格单元格有很多问题,但这个问题很奇怪。我有一个tableView,每个单元格现在都有自定义UILabelUIImageView

目前只有2个细胞。第一个显示日期。当表首次加载时,它会在第一个单元格UILabel中将当前日期显示为字符串。

当我选择第一个单元格时,我会出现一个处理所有日期选择的自定义类。选择日期后,会弹出此视图,然后返回到表格视图。

-(void)viewDidAppear上,重新加载了tableviews数据,并显示新的选定日期。

但是,第一个单元格中的标签未更新。

令人困惑的是,如果我有多个单元格都显示相同的数据,这些将全部刷新并按预期显示新日期。似乎索引:0处的单元格行不会刷新。

进一步混淆的是当我查询单元格的UILabel的字符串值时,它返回正确的日期。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

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

        // 
        // clears the grouped style border from each table cell
        //

        UIView *clearBgView = [[UIView alloc]initWithFrame:CGRectZero];
        [cell setBackgroundView:clearBgView];

        // label
        UILabel *dl = [[UILabel alloc]initWithFrame:CGRectMake(70.0f, 10.0f, screenWidth-100, 50)];
        [self setDetailsLabel:dl];
        dl = nil;

        [[self detailsLabel] setBackgroundColor:[UIColor colorWithRed:.1 green:.1 blue:.1 alpha:.1  ]];
        [[self detailsLabel] setTextColor:[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:.3f]];

        //icon for each cell
        UIImageView *ci = [[UIImageView alloc]initWithFrame:CGRectMake(10.0f, 10.0f, 50.0f, 50.0f)];
        [ci setBackgroundColor:[UIColor colorWithRed:.2 green:.2 blue:.2 alpha:.2]];
        [self setCellIcon:ci];
        ci = nil;

        //
        // set up views
        //

        [cell addSubview:[self cellIcon]];
        [cell addSubview:[self detailsLabel]];
    }

    // Configure the cell...
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];



    //populate each by row.
    NSString *dateDisplay = [self formatDate:[self dateCaught]];
    NSLog (@"date is %@", dateDisplay);
   [[self detailsLabel] setText:[self formatDate:[self dateCaught]]];

    switch (indexPath.row) { //this needs to be an integer, so return the row of the indexPath.
        case 0:
            NSLog (@"text for the cell is %@",[[self detailsLabel]text]);
            break;

        default:
            break;
    }


return cell;

}

2 个答案:

答案 0 :(得分:4)

问题与你传递detailsLabel的方式有关。您将其保存在self

上的属性或ivar中
[self setDetailsLabel:dl];

但只有当单元格可供重复使用时才设置它。当您重复使用单元格时,detailsLabel上的self将设置为先前运行的标签,从而导致各种问题。

最干净的解决方案是创建自己的派生自UITableViewCell的类,将创建标签,图标,背景颜色等的初始化代码移动到指定的初始值设定项中,并创建用于设置标签文本的属性。有了这个类,您就可以按如下方式简化代码:

UIMyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UIMyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[[cell detailsLabel] setText:[self formatDate:[self dateCaught]]];
// ^--- detailsLabel can be moved to UIMyCustomTableViewCell now

答案 1 :(得分:0)

解决方案是,不使用@property detailsLabel之类的成员变量,而是使用所有自定义子视图的标记。像这样更改你的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            [...]

            // label
            UILabel *dl = [[UILabel alloc]initWithFrame:...];
            dl.tag = 99;
            [cell.contentView addSubview: dl];

            [...]
        }

        [...]

       UILabel *dl = [cell.contentView viewWithTag: 99];
       [dl setText:[self formatDate:[self dateCaught]]];

       [...]
       return cell;
}