Возникла проблема с повторным использованием UITableViewCell - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть следующий код, который рисует разделительную линию и текст для UITableViewCell.Это выглядит хорошо, но когда я прокручиваю экран, а затем назад, разделительная линия исчезает, но текст все еще в порядке.Есть идеи?

  static NSString *aProgressIdentifier = @"CustomerCell";
                UITableViewCell *aCustomerCell = [iTableView dequeueReusableCellWithIdentifier:aProgressIdentifier];
                if (!aCustomerCell) {
                    aCustomerCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:aProgressIdentifier] autorelease];
                    aCustomerCell.contentView.backgroundColor = [UIColor whiteColor];
                    UIImageView *aLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 72, 800, 1)];
                    aLine.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
                    [aCustomerCell addSubview:aLine];
                    [aLine release];
                }

                CMACustomer *aCustomerObject = aCellObject;
                aCustomerCell.textLabel.text = aCustomerObject.customerFullName;
                aCustomerCell.detailTextLabel.text = nil;     
                aCell = aCustomerCell;

Ответы [ 3 ]

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

Попробуйте добавить представление изображения «aLine» в качестве подпредставления contentView, а не всей таблицы. Вероятно, когда ячейка используется повторно, а затем снова вызывается layoutSubviews, contentView перекрывает (белый фон) вашу aLine. Фактически, учтите, что ячейки по умолчанию в iOS имеют свои подпредставления, которые динамически перерисовываются и меняются при каждом отображении на экране.

Итак, я бы попробовал это:


[aCustomerCell.contentView addSubview:aLine];

Если это не работает, что вы можете сделать, это полностью удалить contentView и добавить свои собственные пользовательские подпредставления (делайте это внутри if (! ACustomerCell), а не снаружи, если только вы не получите преимущества от этой ячейки. -использование):


 if (!aCustomerCell) {
    aCustomerCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:aProgressIdentifier] autorelease];
     [cell.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
     UIImageView *aLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 72, 800, 1)];
     aLine.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
     [aCustomerCell.contentView addSubview:aLine];
     [aLine release]; 
}   

Наконец, еще одна проверка состоит в том, чтобы проверить, что высота ячейки> 72 (это кажется тривиальной проверкой, но часто источником головной боли!).

1 голос
/ 22 февраля 2012

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

UIImageView *aLine = (UIImageView *)[cell viewWithTag:64];
if (!aLine) {
    // etc.
    UIImageView *aLine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 72, 800, 1)];
    aLine.tag = 64;
    [cell addSubview:aLine];
    //
}
// other formatting logic here, you can also hide/show aLine based on biz logic
0 голосов
/ 21 февраля 2012

попробуйте добавить его в contentView

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