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

Как я могу перебирать ячейки UITableView?

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

4b9b3361

Ответ 1

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

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]);
}

Ответ 2

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

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

        }
    }

Ответ 3

for (UIView *view in TableView.subviews) {
    for (tableviewCell *cell in view.subviews) {
       //do
    }
}

Ответ 4

Принятый ответ быстро для людей, которые не знают 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)
    }
}

Ответ 5

Так как 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], чтобы быть в безопасности.

Ответ 6

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

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

Ответ 7

Здесь совершенно другой способ мышления о цикле с помощью строк 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, вы можете изменить строку, представляющую имя изображения. Тонны опций для циклического перемещения данных в таблицеView без использования каких-либо делегированных свойств UITableView.

Ответ 8

для xcode 9 используйте это - (аналогично @2ank3th, но код изменяется для быстрого 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)"
        }
    }
}