iPad: перебирать каждую ячейку в UITableView? - PullRequest
33 голосов
/ 13 апреля 2011

iPad: перебирать каждую ячейку в UITableView?

Ответы [ 7 ]

65 голосов
/ 13 апреля 2011
for (int section = 0; section < [tableView numberOfSections]; section++) {
    for (int row = 0; row < [tableView numberOfRowsInSection:section]; row++) {
        NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:cellPath];
        //do stuff with 'cell'
    }
}
26 голосов
/ 13 апреля 2011

Чтобы выполнить итерацию по каждой видимой ячейке в UITableView:

for (UITableViewCell *cell in self.tableView.visibleCells) {
    NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:cell];

(отредактировано для лучшего ответа на вопрос о состоянии и надеюсь, что это будет более точно проиндексировано для результатов поиска с целью экономии других временив будущем)

4 голосов
/ 20 февраля 2012

(Это основано на ответе на вопрос об ароматах.)

Мне нравится определять это как категорию для UITableView, поэтому она доступна везде.

(Как уже упоминалось несколько раз, вы должны бытьуверен, что действительно хотите перебрать сами ячейки. Например: я использую это, чтобы очистить UITableViewAccessoryCheckmark от всех ячеек перед установкой в ​​ячейку, выбранную пользователем. Хорошее правило:делать это только в том случае, если методы источника данных не могут сделать то, что вам нужно.)

Определите так:

- (void)enumerateCellsUsingBlock:(void (^)(UITableViewCell *cell))cellBlock {
    NSParameterAssert(cellBlock != nil);
    for (int section = 0; section < [self numberOfSections]; section++) {
        for (int row = 0; row < [self numberOfRowsInSection:section]; row++) {
            NSIndexPath *cellPath = [NSIndexPath indexPathForRow:row inSection:section];
            UITableViewCell *cell = [self cellForRowAtIndexPath:cellPath];
            if (cellBlock != nil) {
                cellBlock(cell);
            }
        }
    }
}

Вызовите так:

[self.tableView enumerateCellsUsingBlock:^(UITableViewCell *cell) {
    NSLog(@"cell:%@", cell);
}];

Было бы неплохо также ввести определение блока.

2 голосов
/ 13 апреля 2011

Предполагая, что переменная myTableView существует и ее делегат и источник данных установлены:

UITableViewCell *cell;
NSIndexPath indexPath = [[NSIndexPath indexPathForRow:0 inSection:0];
for(indexPath.section = 0; indexPath.section < [myTableView numberOfSections]; ++indexPath.section)
{
    for(indexPath.row = 0; indexPath.row < [myTableView numberOfRowsInSection:indexPath.section]; ++indexPath.row)
    {
        cell = [myTableView cellForRowAtIndexPath:indexPath];
        // do something with this cell
    }
}
1 голос
/ 08 февраля 2019

Swift 4:

for section in 0...self.tableView.numberOfSections - 1 {
            for row in 0...self.tableView.numberOfRows(inSection: section) - 1 {
                let cell = self.tableView.cellForRow(at: NSIndexPath(row: row, section: section) as IndexPath)

                print("Section: \(section)  Row: \(row)")

            }
        }

от steve Выполните итерацию по всем UITableCells, указав идентификатор секции

1 голос
/ 15 марта 2014

Еще проще и элегантнее:

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
                                         forRowAtIndexPath:(NSIndexPath *)indexPath {
    // use the "cell" here
}

Но, очевидно, это не подходит для всех ситуаций.

0 голосов
/ 17 сентября 2015

Вот как я перебираю все ячейки табличного представления, даже невидимые, проверьте мой ответ здесь:

https://stackoverflow.com/a/32626614/2715840

Подсказка: код в Swift.

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