Обновление чередующихся цветных UITableViewCells, когда строки переупорядочиваются или удаляются - PullRequest
5 голосов
/ 24 августа 2009

У меня UITableView с чередующимися цветными UITableViewCells. И таблицу можно редактировать: строки можно переупорядочивать и удалять. Как обновить чередующийся фоновый цвет ячеек, когда строки переупорядочены или удалены?

Я использую это для рисования чередующихся цветных ячеек:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([indexPath row] % 2) {
        // even row
        cell.backgroundColor = evenColor;
    } else {
        // odd row
        cell.backgroundColor = oddColor;
    }
}

Но этот метод не вызывается, когда строка переупорядочивается или удаляется. И я не могу вызвать [tableView reloadData] из следующего метода, потому что это приводит к сбою приложения в бесконечном цикле:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    // Move the object in the array
    id object = [[self.list objectAtIndex:[fromIndexPath row]] retain];
    [self.list removeObjectAtIndex:[fromIndexPath row]];
    [self.list insertObject:object atIndex:[toIndexPath row]];
    [object release];

    // Update the table ???
    [tableView reloadData]; // Crashes the app in an infinite loop!! 
}

Есть ли у кого-нибудь указатель или лучшее решение для решения проблемы изменения порядка чередующихся цветных ячеек?

Спасибо

Ответы [ 6 ]

5 голосов
/ 24 августа 2009

Использовал отложенный вызов для выполнения перезагрузки, если вы не можете вызвать из этого метода:

[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.0f];

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

4 голосов
/ 14 февраля 2013

Нет необходимости использовать сторонние объекты или перезагрузить / обновить весь источник данных. Просто используйте правильные инструменты в вашем швейцарском ноже:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(editingStyle == UITableViewCellEditingStyleDelete) {
        //1. remove your object
        [dataSource removeObjectAtIndex:indexPath.row];

        //2. update your UI accordingly
        [self.myTableView beginUpdates];
        [self.myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
        [self.myTableView endUpdates];

        //3. obtain the whole cells (ie. the visible ones) influenced by changes
        NSArray *cellsNeedsUpdate = [myTableView visibleCells];
        NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
        for(UITableViewCell *aCell in cellsNeedsUpdate) {
            [indexPaths addObject:[myTableView indexPathForCell:aCell]];
        }

        //4. ask your tableview to reload them (and only them)
        [self.myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

    }
}
3 голосов
/ 01 декабря 2009

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

1 голос
/ 10 января 2012

Я взял все подпредставления UITableViewCell из таблицы и отсортировал этот массив на основе ячеек frame.origin.y, чтобы они вернулись в правильном порядке. Затем я перебрал изменение цвета фона на основе индекса == 0 || индекс% 2 == 0 перекрашивает их. Кажется, работает лучше, чем перезагрузка tableView, поскольку это приводило к рывку анимации. Работал для меня в 1:25

0 голосов
/ 22 августа 2015

Это хорошо работает. Начните паттерн с последнего индекса, а не с первого. Таким образом, каждая клетка всегда сохраняет свой фон:

    if (dataSource.count - indexPath.row) % 2 == 0 {
        cell.backgroundColor = UIColor.grayColor()
    } else {
        cell.backgroundColor = UIColor.whiteColor()
    }

Я пробовал другие решения, но не был полностью удовлетворен. Это решение не является взломом и даже не добавляет еще одну строку кода.

0 голосов
/ 24 августа 2009

[tableView reloadData] вернет фон вашего стола в ход событий. Другой вариант - поменять цвета фона всех видимых ячеек с indexPath нижнего индекса при перемещении до самого высокого в visibleCells.

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