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



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

517   8  

8 ответов:

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

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 - это класс, который содержит свойство текст типа UITextField)

for (CustomTableViewCell *cell in cells)
{
    UITextField *textField = [cell textField];
    NSLog(@"%@"; [textField text]);
}

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

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

        }
    }

принятый ответ в swift для людей, которые не знают 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)
    }
}
for (UIView *view in TableView.subviews) {
    for (tableviewCell *cell in view.subviews) {
       //do
    }
}

С 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] на всякий случай.

для 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)"
        }
    }
}

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

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

вот совершенно другой способ мышления о цикле через строки 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.

Comments

    Ничего не найдено.