Подтвердить что ты не робот

IPad: Итерации по каждой ячейке в UITableView?

iPad: Итерации по каждой ячейке в UITableView?

4b9b3361

Ответ 1

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'
    }
}

Ответ 2

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

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

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

Ответ 3

(Это основано на ответе аротов.)

Мне нравится определять это как категорию для 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);
}];

Было бы неплохо также напечатать блок.

Ответ 4

Предполагается, что существует переменная 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
    }
}

Ответ 5

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

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

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

Ответ 6

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

fooobar.com/info/168440/...

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