iPhone TableViewCell动态高度崩溃

时间:2010-08-13 17:24:34

标签: iphone objective-c uitableview height

我一直在尝试创建一个TableViewCell,它包含第一行中的2个UILabel,以及第二行中的另一个UILabel。

框架和布局标签在模拟器中正常工作。但是:

1)每个单元格的高度不会动态增加/减少

2)只要在模拟器中滚动

,表就会崩溃

有人可以向我解释一下我在这段代码中做错了什么吗?无法弄清楚。

这是我正在尝试创建的单元格的图片:

Ťalt text http://www.bubl3r.com/photo.JPG

这是我动态分配单元格高度的方法:

#define CELL_PADDING 10.0f
#define IMAGE_SIDE_SIZE 50.0f
#define LABEL_HEIGHT 14.0f
#define LABELWIDTH_CALLSIGN 160.0f
#define LABELWIDTH_DATE 60.0f
#define LABELWIDTH_USER 160.0f
#define FONT_SIZE 11.0f


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {


    RFFlag *aFlag = [flagList objectAtIndex:[indexPath row]];

    CGSize messageConstraint = CGSizeMake(LABELWIDTH_CALLSIGN + LABELWIDTH_DATE + CELL_PADDING,20000.0f);
    CGSize messageSize = [aFlag.msg.station.callsign sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:messageConstraint lineBreakMode:UILineBreakModeWordWrap];
    CGFloat height = MAX(messageSize.height, 44.0f);

    CGFloat cellHeight = height + LABEL_HEIGHT + (CELL_PADDING * 3);

    return cellHeight;
}

这是我的CelLForRowAtIndexPathMethod:

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

        RFFlag *aFlag = [flagList objectAtIndex:[indexPath row]];
        UITableViewCell *cell;
        UILabel *callsign,*dateposted,*message;

        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

        if (cell == nil) {

            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"]autorelease];


            callsign = [[UILabel alloc] initWithFrame:CGRectMake(IMAGE_SIDE_SIZE + (CELL_PADDING*2), CELL_PADDING, LABELWIDTH_CALLSIGN, LABEL_HEIGHT)];
            [callsign setMinimumFontSize:FONT_SIZE];
            [callsign setFont:[UIFont systemFontOfSize:FONT_SIZE]];
            [callsign setTag:3];

            [[cell contentView] addSubview:callsign];

            dateposted = [[UILabel alloc] initWithFrame:CGRectMake(CELL_PADDING*3 + IMAGE_SIDE_SIZE + LABELWIDTH_CALLSIGN, CELL_PADDING, LABELWIDTH_DATE, LABEL_HEIGHT)];       
            [dateposted setMinimumFontSize:FONT_SIZE];
            [dateposted setFont:[UIFont systemFontOfSize:FONT_SIZE]];
            [dateposted setTag:2];

            [[cell contentView] addSubview:dateposted];


            message = [[UILabel alloc] initWithFrame:CGRectZero];
            [message setLineBreakMode:UILineBreakModeWordWrap];
            [message setMinimumFontSize:FONT_SIZE];
            [message setNumberOfLines:0];
            [message setFont:[UIFont systemFontOfSize:FONT_SIZE]];
            [message setTag:1];

            [[cell contentView] addSubview:message];

        }
        if (!message)
            message = (UILabel*)[cell viewWithTag:1];



        [message setText:aFlag.msg.messageData];
        [callsign setText:aFlag.msg.station.callsign];
        [dateposted setText:aFlag.msg.createdDate];


        CGSize messageConstraint = CGSizeMake(LABELWIDTH_CALLSIGN + LABELWIDTH_DATE + CELL_PADDING, 20000.0f);
        CGSize messageSize = [aFlag.msg.messageData sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:messageConstraint lineBreakMode:UILineBreakModeWordWrap];
        [message setFrame:CGRectMake(IMAGE_SIDE_SIZE + (CELL_PADDING*2), LABEL_HEIGHT + (CELL_PADDING*2), LABELWIDTH_CALLSIGN + CELL_PADDING + LABELWIDTH_DATE, MAX(messageSize.height,44.0f))];

        return cell;
    }

4 个答案:

答案 0 :(得分:1)

你肯定做错的一件事是使用变量callign,dateposted和message。这些声明在哪里?

一旦开始滚动,iPhone将重复使用滚动视图的单元格。在这些情况下,您不会为上述变量分配新值。他们可能会引用刚刚被释放的对象。

我需要将这些变量作为方法的局部变量。如果dequeueReusableCellWithIdentifier:返回现有的表格单元格,则需要深入查看单元格的子视图以找到三个标签并将它们分配给变量。

答案 1 :(得分:0)

高度问题可能与您获得messageSize的电话有关,但如果不知道RFFlag是什么,我就不能说更多。

关于崩溃我认为当重复使用一个单元时会发生这种情况:在这种情况下

[callsign setText:aFlag.msg.station.callsign];

已执行但callign是堆栈中未初始化的变量,可能是任何内容,并且您尝试向其发送消息。与dateposted相同。

顺便说一句,当您创建UILabels时,由于您从未发布内存泄漏而导致内存泄漏。

答案 2 :(得分:0)

崩溃是EXC_BAD_ACCESS吗?如果是这样,试试这个

  1. 运行构建和分析 - 它干净吗?仔细看看它说的一切。

  2. 使用NSZombiesEnabled运行:我在这里写了关于如何做到这一点的博客:

    http://loufranco.com/blog/files/debug-iphone-crash-EXC_BAD_ACCESS.html

    这会导致运行时不释放对象,而是在向具有0 retainCount的对象发送消息时抱怨。

答案 3 :(得分:0)

也许这link可以帮助您解决身高问题。

或 也许高度问题与你获得messageSize的调用有关,但是如果不知道什么是RFFlag,我就不能说更多。

关于崩溃我认为当重复使用一个单元时会发生这种情况:在这种情况下

[callsign setText:aFlag.msg.station.callsign];

已执行但callign是堆栈中未初始化的变量,可能是任何内容,并且您尝试向其发送消息。同样适用于dateposted。

顺便说一句,当您创建UILabels时,由于您从未发布内存泄漏而导致内存泄漏。