UITableViewCell не отображает текст - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть небольшое приложение, которое перечисляет кучу элементов в базе данных. Если вы щелкнете по одному из элементов, приложение переключится на новое представление, которое покажет вам всю информацию об этом конкретном элементе. Поскольку объем отображаемой информации является динамическим, я делаю это, делая второе представление UITableView и устанавливая размер каждой строки, как это необходимо для конкретного отображаемого объекта. Обычно это работает нормально, но у одного из элементов есть стена текста для последнего отображаемого элемента. Когда я пытаюсь просмотреть информацию об этом конкретном объекте, он ничего не отображает там, где должна быть стена текста.

При дублировании я могу сказать, что текст, который используется для определения размера ячейки и метки, должен быть правильным. Похоже, что он правильно определяет размер (он дает мне высоту 21298 для ячейки и 21294 для метки), и я могу прокрутить вниз, что кажется довольно большой пустой меткой. Тем не менее, дисплей немного запутался, как будто экран обновлялся. Текст в верхней части представления заикается с того места, где он начинался, вплоть до верхней части экрана, а полоса прокрутки с правой стороны также перерисовывается неправильно.

Кто-нибудь видел что-то подобное раньше?

Извините, я не могу опубликовать скриншоты, которые у меня есть, так как мне не хватает представителя

РЕДАКТИРОВАТЬ: разобрался с ответом. Я опубликую его как ответ, как только пройдет минимальное время.

Я нашел обходной путь, если кто-то еще столкнется с этим.

После недолгих поисков я обнаружил, что когда длина строки источника достигает примерно 41000, она начинает вызывать эту ошибку рисования. Поэтому я разделил любую строку на ~ 30 000 и добавил несколько строк в таблицу. Теперь он отображает всю стену текста.

Код:

#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 2.0f

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
  //static NSString *CellIdentifier = @"Cell";
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", [indexPath row]];
UILabel *label = nil;

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

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

    if ([indexPath row] == 1 || [indexPath row] == 2)
    {
        [label setTextColor:[UIColor redColor]];
    }
    else if ([indexPath row] == 3)
    {
        [label setTextColor:[UIColor colorWithRed:0.0f green:150.f/255.f blue:30.f/255.f alpha:1.0f]];
    }
    else if ([indexPath row] == 5)
    {
        [label setTextColor:[UIColor colorWithRed:155.f/255.f green:145.f/255.f blue:0.0f alpha:1.0f]];
    }

    [[cell contentView] addSubview:label];
}

NSString *text = [cardInfo objectAtIndex:[indexPath row]];

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

if (!label)
{
    label = (UILabel *)[cell.contentView viewWithTag:1];
}

[label setText:text];
[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), MAX(size.height, 30.0f))];

// Configure the cell...

return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text = [cardInfo objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 30.0f);
return height + (CELL_CONTENT_MARGIN * 2);
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Это ошибка:

[label setTag:[indexPath row]];

Когда вы строите иерархию представления ячейки, вы никогда не должны ссылаться на номер строки.Зачем?Потому что ячейка может быть повторно использована для другой строки!Вот что такое dequeueReusableCellWithIdentifier:.

Вместо этого определите константу для тега вашего ярлыка:

static const int LabelTag = 100;

Используйте эту константу для установки тега:

label.tag = LabelTag;

и позже, когда вам нужно выбрать метку, чтобы установить ее текст, снова используйте константу:

label = (UILabel *)[cell.contentView viewWithTag:LabelTag];
0 голосов
/ 24 февраля 2012

Я нашел обходной путь, если кто-то еще столкнется с этим.

После недолгих поисков я обнаружил, что, когда длина строки источника достигает примерно 41000, она начинает вызывать эту ошибку рисования. Поэтому я разделил любую строку на ~ 30 000 и добавил несколько строк в таблицу. Теперь он отображает всю стену текста.

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