Вопрос

Я использую следующий метод в своем приложении:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == 0)
    {
        cell.contentView.backgroundColor = [UIColor lightGrayColor];
        cell.contentView.alpha = 0.5;
    }
}   

Когда я запускаю приложение, в моей таблице 7 строк. В соответствии с вышеуказанной функцией должна форматироваться только ячейка первой строки (номер строки 0) (из-за условия if).

Ячейка 1-й строки (номер строки 0) отформатирована правильно (согласно желаемому результату). Но если я прокручиваю таблицу вниз, еще одна ячейка отображается в формате: ячейка в строке номер 5.

Почему так?

Это было полезно?

Решение

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

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

Более элегантное решение состоит в том, чтобы форматировать 1-ю строку иначе, чем другие, только один раз. : когда вы создаете свои клетки.

    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier;
        if(indexPath.row == 0)
        CellIdentifier = @"1stRow";
        else
        CellIdentifier = @"OtherRows";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell==nil) { 
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            if(indexPath.row == 0){
                cell.contentView.backgroundColor = [UIColor lightGrayColor];  
                cell.contentView.alpha = 0.5;
                    // Other cell properties:textColor,font,...
            }
            else{
                cell.contentView.backgroundColor = [UIColor blackColor];  
                cell.contentView.alpha = 1;
                //Other cell properties: textColor,font...
            }

        }
        cell.textLabel.text = .....
        return cell;
    }

Другие советы

Я думаю, причина в том, что TableView повторно использует уже существующие ячейки и отображает их, если это возможно. Что здесь происходит - когда таблица прокручивается и строка 0 становится невидимой, то соответствующая ячейка используется для новой отображаемой строки. Поэтому, если вы повторно используете ячейки, вы должны сбросить их свойства:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
   if(indexPath.row == 0) { 
       cell.contentView.backgroundColor = [UIColor lightGrayColor];  
       cell.contentView.alpha = 0.5; } 
   else
   {
    // reset cell background to default value
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top