Как я создаю строки с чередованием цветов для UITableView на iPhone?

я был бы, чтобы иметь альтернативные 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.

Какие-либо идеи?

TIA

10
задан Astoria 14 September 2015 в 16:37
поделиться

2 ответа

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

if( !cell ) {
  // create the cell and stuff
}
if( [indexPath row] % 2)
  [cell setBackgroundColor:[UIColor whiteColor]];
else
  [cell setBackgroundColor:[UIColor purpleColor]];
25
ответ дан 3 December 2019 в 15:51
поделиться

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

2
ответ дан 3 December 2019 в 15:51
поделиться