iPhone TableViewCell с динамическим падением высоты - PullRequest
0 голосов
/ 13 августа 2010

Я пытался создать TableViewCell, состоящий из 2 UILabel в первом ряду и другого UILabel во втором ряду.

В симуляторе правильно работает макет рамок и меток. Тем не менее:

1) Высота не динамически увеличивается / уменьшается с каждой ячейкой

2) Таблица вылетает всякий раз, когда она прокручивается в симуляторе

Может кто-нибудь объяснить мне, что я делаю не так в этом коде? Не могу понять это.

Вот изображение ячейки, которую я пытаюсь создать:

T альтернативный текст 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 ]

1 голос
/ 13 августа 2010

Одна вещь, которую вы наверняка делаете неправильно - это использование переменных позывного, dateposted и message.Где они объявляются?

Как только вы начнете прокручивать, iPhone будет использовать ячейки, которые прокручиваются вне поля зрения.В этих случаях вы не назначаете новые значения указанным переменным.Вероятно, они ссылаются на только что освобожденный объект.

Мне нужно сделать эти переменные локальными переменными метода.Если dequeueReusableCellWithIdentifier: возвращает существующую ячейку таблицы, вам нужно покопаться во вложенных представлениях ячейки, чтобы найти три метки и присвоить их переменной.s

0 голосов
/ 03 октября 2013

Может быть, эта ссылка может помочь вам с проблемой роста.

или Возможно, проблема с высотой связана с вызовом, когда вы получаете messageSize, но я не могу сказать больше, не зная, что такое RFFlag.

О сбое, я думаю, это происходит, когда ячейка используется повторно: в этом случае

[позывной setText: aFlag.msg.station.callsign];

выполняется, но позывной - это неинициализированная переменная в стеке, которая может быть чем угодно, и вы пытаетесь отправить ему сообщение. То же самое для даты размещения.

И, кстати, когда вы создаете UILabels, вы вызываете утечку памяти, потому что вы никогда не освобождаете их.

0 голосов
/ 13 августа 2010

Сбой EXC_BAD_ACCESS?Если это так, попробуйте это

  1. Запустите сборку и анализ - это чисто?Внимательно посмотрите на все, что он говорит.

  2. Запуск с NSZombiesEnabled: я писал о том, как это сделать здесь:

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

    Это приводит к тому, что среда выполнения не освобождает объекты и вместо этогожалуется, если вы отправляете сообщения объектам с 0 retainCount.

0 голосов
/ 13 августа 2010

Может быть, проблема с высотой связана с вызовом, когда вы получаете messageSize, но я не могу сказать больше, не зная, что такое RFFlag.

Об аварии, я думаю, это происходит, когда ячейкаиспользуется повторно: в этом случае

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

выполняется, но позывной является неинициализированной переменной в стеке, которая может быть чем угодно, и вы пытаетесь отправить ему сообщение.То же самое для dateposted.

И, кстати, когда вы создаете UILabels, вы вызываете утечку памяти, потому что вы никогда не выпускаете их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...