iPad: Итерации по каждой ячейке в UITableView?
IPad: Итерации по каждой ячейке в UITableView?
Ответ 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
Это то, как я итерации по всем ячейкам просмотра таблицы даже не видны, проверьте мой ответ здесь:
Подсказка: код в Swift.