¿Cómo puedo recorrer las células de UITableView?

Tengo n secciones (cantidad conocida) y filas X en cada sección (cantidad desconocida). Cada fila tiene un UITextField. Cuando el usuario pulsa el button "Listo", quiero repetir a través de cada celda y hacer algunas testings condicionales con UITextField. las testings que pasan los datos de cada celda se escriben en una database. De lo contrario, se muestra un UIAlert. ¿Cuál es la mejor manera de recorrer las filas y si hay una solución más elegante a esto, por favor avise.

Si solo desea iterar por las celdas visibles, use

 NSArray *cells = [tableView visibleCells]; 

Si desea todas las celdas de la vista de tabla, use esto:

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

Ahora puedes iterar a través de todas las celdas:
( CustomTableViewCell es una class que contiene la propiedad textField del tipo UITextField )

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

Aquí hay una buena implementación rápida que me funciona.

  func animateCells() { for cell in tableView.visibleCells() as! [UITableViewCell] { //do someting with the cell here. } } 
 for (UIView *view in TableView.subviews) { for (tableviewCell *cell in view.subviews) { //do } } 

Respuesta aceptada rápida para personas que no conocen ObjC (como yo).

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

Como iOS puede reciclar las celdas de tablaView que están fuera de la pantalla, debe manejar una celda de tablaView a la vez:

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

Puede recostackr un NSArray de todas las células beforehands SOLO, cuando la list completa esté visible. En tal caso, use [tableView visibleCells] para estar seguro.

rápido y sucio:

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

Aquí hay una manera completamente diferente de pensar en hacer un bucle a través de las filas de UITableView … aquí hay un ejemplo de cómo cambiar el text que podría llenar su UITextView haciendo un bucle a través de su matriz, lo que significa básicamente los datos de su celda tableView.

Todas las celdas están pobladas con datos de algún tipo de model. Un model muy común estaría utilizando un NSObject y NSMutableArray de esos objects. Si estuvieras en didSelectRowAtIndexPath, entonces querrías hacer algo así para afectar la fila que estás seleccionando después de modificar la matriz anterior:

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

Este código eliminará todo el text de UITextField en cada fila excepto la que seleccionó, dejando el text "seleccionado" en el campo UITextField de la celda tocada siempre que use obj.someString para rellenar el text del campo en cellForRowAtIndexPath o willDisplayRowAtIndexPath utilizando YourObject y yourArray

Este tipo de "bucle" no requiere condiciones de celdas visibles frente a celdas no visibles. Si tiene varias secciones pobladas por una variedad de dictionarys, puede usar la misma lógica al usar una condición en un valor key. Tal vez quiera alternar una celda imageView, podría cambiar la cadena que representa el nombre de la image. Toneladas de opciones para recorrer los datos en su tablaView sin usar ninguna propiedad UITableView delegada.

para xcode 9 use esto – (similar a @ 2ank3th pero el código se cambia para 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)" } } }