我怎样才能循环通过UITableView的单元格?

我在每个部分中有n个部分(已知数量)和X行(未知数量,每行都有一个UITextField,当用户点击“完成”button时,我想遍历每个单元格,并使用UITextField进行一些条件testing。testing通过每个单元格的数据写入数据库,如果没有,那么显示一个UIAlert。什么是最好的方式来循环行,如果有一个更优雅的解决scheme,请做build议。

如果你只想遍历可见的单元格,然后使用

 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是一个类,它包含UITextFieldtypes的属性textField

 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. } } 
 for (UIView *view in TableView.subviews) { for (tableviewCell *cell in view.subviews) { //do } } 

对于不了解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) } } 

由于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]是安全的。

快速和肮脏:

 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中,那么你会想要做这样的事情来修改上面的数组之后影响你select的行:

 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文本,只要您使用obj.someString填充cellForRowAtIndexPath或使用YourObject的willDisplayRowAtIndexPath中的字段的文本,在被单击的单元格的UITextField中保留文本“selected” 你的阵营

这种“循环”不需要可见细胞vs不可见细胞的任何条件。 如果您有多个词典数组填充了多个部分,则可以使用键值上的条件使用相同的逻辑。 也许你想切换单元格imageView,你可以改变表示图像名称的string。 吨的选项循环浏览您的tableView中的数据,而不使用任何委托UITableView属性。

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