Как я могу динамически изменить цвет фона UITableViewCell? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть переменная, которая будет отслеживать, сколько ячеек нужно раскрасить.Поэтому, если эта переменная равна 3, то цвет фона трех верхних ячеек изменится.Как я могу это сделать?

Я знаю, что мне нужно обновить это в

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

Но как я могу убедиться, что верхние ячейки имеют другой цвет фона в зависимости от моей переменной?

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Параметр indexPath является вашей отправной точкой. Если coloredCells является целым числом, которое содержит количество окрашиваемых ячеек, ваш метод будет содержать что-то вроде

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    // fetch or create the cell, first
    UITableViewCell *cell = // ... 

    // then set it up
    if(indexPath.row < self.coloredCells) {
        cell.contentView.backgroundColor = [UIColor redColor];
    } else {
        cell.contentView.backgroundColor = [UIColor whiteColor];
    }

    // perform rest of cell setup
    // ...

    return cell;
}

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

// elsewhere...
self.coloredCells = 4;
[self.tableView reloadData];

Или вы можете приложить немного больше усилий, чтобы перезагрузить только те ячейки, которые имеют цветной фон:

self.coloredCells = newColoredCount;
NSMutableArray *indexPaths = [NSMutableArray arrayWithCapacity:newColoredCount];
for(int i = 0; i < newColoredCount; i++) {
    [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
0 голосов
/ 02 декабря 2011

Нет, вам не нужно обновлять метод делегата tableView:cellForRowRowAtIndexPath:. Все, что вам нужно сделать, это:

[self.tableView cellForRowAtIndexPath:indexPath].backgroundColor = desiredUIColor;

Обратите внимание, что вызов tableView:cellForRowAtIndexPath: из типа id<UITableViewDataSource> отличается от вызова cellForRowAtIndexPath: из типа UITableView. Первый вызывает метод делегата (это никогда не должно вызываться напрямую), а второй возвращает текущую ячейку для пути индекса без пересчета ячейки .

Если в вашем табличном представлении есть только один раздел, вычислить верхние ячейки n просто. Если ваша «переменная, которая будет отслеживать, сколько ячеек должно быть окрашено», равна (NSUInteger)numberOfHighlightedCells, это простой код цикла, который вы можете запустить:

NSUInteger i;

for (i = 0; i < numberOfHighlightedCells; i++) {
    [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]].backgroundColor = desiredUIColor;
}

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

0 голосов
/ 02 декабря 2011

Вы можете использовать tableView: willDisplayCell: forRowAtIndexPath: of UITableViewDelegate , чтобы изменить такие вещи, как цвет фона ячейки. Изменения, сделанные в cellForRowAtIndexPath, могут быть потеряны до фактического отображения ячейки, поэтому обычно лучше сделать это в этом методе.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row < numberOfColoredRows) {
        cell.backgroundColor = [UIColor redColor];
    }
}

Из обсуждения этого метода в ссылке:

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

0 голосов
/ 02 декабря 2011

Вы должны проверить номер строки и соответственно изменить цвет.В cellForRowAtIndexPath используйте:

 //having allocated or recycled a cell into myCell pointer above
 //test for row and assign background color like so

if (indexPath.row < 3) {
  myCell.contentView.backgroundColor = [UIColor greenColor];
 } else {
  myCell.contentView.backgroundColor = [UIColor redColor];
 }

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