Как создать строки с чередующимися цветами для UITableView на iPhone? - PullRequest
10 голосов
/ 03 апреля 2010

я бы хотел иметь чередующиеся 2 цвета строк, например, первый черный, второй белый, третий черный и т. Д. И т. Д.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
cell = ((MainCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]);
if (cell==nil) {

    NSArray *topLevelObjects=[[NSBundle mainBundle] loadNibNamed:@"MainCell"    owner:self options:nil];

    for (id currentObject in topLevelObjects){
        if ([currentObject isKindOfClass:[UITableViewCell class]]){
            if ((indexPath.row % 2)==0) {
                [cell.contentView setBackgroundColor:[UIColor purpleColor]];

            }else{
                [cell.contentView setBackgroundColor:[UIColor whiteColor]];

            }
            cell =  (MainCell *) currentObject;
            break;
        }
    }

}else {

    AsyncImageView* oldImage = (AsyncImageView*)
    [cell.contentView viewWithTag:999];
    [oldImage removeFromSuperview];
}return cell;

Проблема в том, что когда я делаю быструю прокрутку, фон ячеек становится похожим на последние 2 ячейки черными, первые 2 ячейки белыми или что-то в этом роде, но если я медленно прокручиваю, работает нормально. Я думаю, что проблема в кеше reusableCell.

Есть идеи?

ТИА

Ответы [ 2 ]

25 голосов
/ 03 апреля 2010

Клетки перерабатываются (это то, что вы делаете, когда вы удаляете их из очереди и проверяете, равен ли он нулю).Поэтому вместо того, чтобы устанавливать цвет фона при создании ячейки, установите его через некоторое время.Итак:

if( !cell ) {
  // create the cell and stuff
}
if( [indexPath row] % 2)
  [cell setBackgroundColor:[UIColor whiteColor]];
else
  [cell setBackgroundColor:[UIColor purpleColor]];
2 голосов
/ 03 апреля 2010

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

...