Как я могу пройти через ячейки UITableView? - PullRequest
64 голосов
/ 02 августа 2011

У меня есть n разделов (известное количество) и X строк в каждом разделе (неизвестное количество. Каждая строка имеет UITextField. Когда пользователь нажимает кнопку «Готово», я хочу перебрать каждую ячейку и выполнить некоторые условные тесты сUITextField. Если тесты передают данные из каждой ячейки, записываются в базу данных. Если нет, то отображается UIAlert. Каков наилучший способ циклически проходить по строкам и если есть более элегантное решение для этого, пожалуйста, сообщите.1001 *

Ответы [ 8 ]

161 голосов
/ 02 августа 2011

Если вы хотите перебирать только видимые ячейки, используйте

NSArray *cells = [tableView visibleCells];

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

NSMutableArray *cells = [[NSMutableArray alloc] init];
for (NSInteger j = 0; j < [tableView numberOfSections]; ++j)
{
    for (NSInteger i = 0; i < [tableView numberOfRowsInSection:j]; ++i)
    {
        [cells addObject:[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]];
    }
}

Теперь вы можете перебирать все ячейки:
( CustomTableViewCell - это класс, который содержит свойство textField типа UITextField )

for (CustomTableViewCell *cell in cells)
{
    UITextField *textField = [cell textField];
    NSLog(@"%@"; [textField text]);
}
13 голосов
/ 11 июля 2015

Вот хорошая быстрая реализация, которая работает для меня.

 func animateCells() {
        for cell in tableView.visibleCells() as! [UITableViewCell] {
            //do someting with the cell here.

        }
    }
7 голосов
/ 07 января 2016

Принимается быстрый ответ для людей, которые не знают ObjC (как и я).

for section in 0 ..< sectionCount {
    let rowCount = tableView.numberOfRowsInSection(section)
    var list = [TableViewCell]()

    for row in 0 ..< rowCount {
        let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section)) as! YourCell
        list.append(cell)
    }
}
3 голосов
/ 11 октября 2017

для xcode 9 используйте это - (похоже на @ 2ank3th, но код изменен для swift 4):

let totalSection = tableView.numberOfSections
for section in 0..<totalSection
{
    print("section \(section)")
    let totalRows = tableView.numberOfRows(inSection: section)

    for row in 0..<totalRows
    {
        print("row \(row)")
        let cell = tableView.cellForRow(at: IndexPath(row: row, section: section))
        if let label = cell?.viewWithTag(2) as? UILabel
        {
            label.text = "Section = \(section), Row = \(row)"
        }
    }
}
2 голосов
/ 08 августа 2014

Поскольку iOS может перерабатывать ячейки tableView , находящиеся вне экрана, вы должны обрабатывать tableView по одной ячейке за раз:

NSIndexPath *indexPath;
CustomTableViewCell *cell;

NSInteger sectionCount = [tableView numberOfSections];
for (NSInteger section = 0; section < sectionCount; section++) {
    NSInteger rowCount = [tableView numberOfRowsInSection:section];
    for (NSInteger row = 0; row < rowCount; row++) {
        indexPath = [NSIndexPath indexPathForRow:row inSection:section];
        cell = [tableView cellForRowAtIndexPath:indexPath];
        NSLog(@"Section %@ row %@: %@", @(section), @(row), cell.textField.text);
    }
}

Вы можете собрать NSArray всех ячеек ТОЛЬКО до того, как весь список станет видимым. В таком случае используйте [tableView visibleCells] , чтобы быть в безопасности.

2 голосов
/ 26 ноября 2013
for (UIView *view in TableView.subviews) {
    for (tableviewCell *cell in view.subviews) {
       //do
    }
}
1 голос
/ 22 января 2015

быстро и грязно:

for (UIView *view in self.tableView.subviews){
    for (id subview in view.subviews){
        if ([subview isKindOfClass:[UITableViewCell class]]){
            UITableViewCell *cell = subview;
            // do something with your cell
        }
    }
}
0 голосов
/ 09 июля 2016

Вот совершенно другой способ размышления о циклическом перемещении по строкам UITableView ... вот пример изменения текста, который может заполнить ваш UITextView, путем циклического перемещения по вашему массиву, что по существу означает данные вашей ячейки tableView.

Все ячейки заполнены данными из какой-то модели. Очень распространенной моделью было бы использование NSObject и NSMutableArray этих объектов. Если бы вы находились в didSelectRowAtIndexPath, вы бы хотели сделать что-то подобное, чтобы повлиять на строку, которую вы выбираете после изменения вышеуказанного массива:

for(YourObject *cellRow in yourArray)
{
    if(![cellRow.someString isEqualToString:@""])
    {
         cellRow.someString = @"";
    }
    //...tons of options for conditions related to your data
}

YourObject *obj = [yourArray objectAtIndex:indexPath.row];
obj.someString = @"selected";
[yourArray insertObject:views atIndex:indexPath.row];
[yourArray removeObjectAtIndex:indexPath.row];
[yourTable reloadData];

Этот код удаляет весь текст UITextField в каждой строке, кроме той, которую вы выбрали, оставляя текст «выделенным» в UITextField нажатой ячейки, пока вы используете obj.someString для заполнения текста поля в cellForRowAtIndexPath или willDisplayRowAtIndexPath используя YourObject и yourArray .

Этот тип "зацикливания" не требует условий видимых ячеек по сравнению с невидимыми ячейками. Если у вас есть несколько разделов, заполненных массивом словарей, вы можете использовать ту же логику, используя условие для значения ключа. Может быть, вы хотите переключить ячейку imageView, вы можете изменить строку, представляющую имя изображения. Тонны опций для циклического прохождения данных в вашем tableView без использования каких-либо делегированных свойств UITableView.

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