迭代所有的UITableCells给出一个部分ID

我如何迭代所有的UITableCells给出一个部分ID(例如:第2节中的所有单元格)?

我只看到这个方法: tableView.cellForRowAtIndexPath ,它返回给定的绝对索引1单元格,所以它没有帮助。

有没有一个优雅和简单的方法?

注意:我想以段落中的所有单元格为单位设置AccesoryType为None,例如:在单击button之后,或者在发生事件之后(发生什么事情与问题无关)

我有UITableView的参考和部分的索引。

你误解了桌子的意见是如何工作的。 如果要更改单元格的configuration, 则不要直接修改单元格。 相反,您更改这些单元格的数据(模型),然后告诉您的表格视图重新加载更改的单元格。

这是基本的,如果你试图以另一种方式做,它将无法正常工作。

你说:“我需要修改它们之前的单元格arrays…”同样的事情适用。 您不应该将状态数据存储在单元格中。 只要用户对单元格进行更改,您应该收集更改并将其保存到模型中。 单元格可以在屏幕之外滚动,并且可以随时丢弃它们的设置。

@LozZsolt要求你展示你的代码,因为从你提出的问题来看,很明显你正在以错误的方式去做事情。

编辑:

如果您确信需要迭代某个节中的单元格,那么您可以在表格视图中查询目标节中的行数,然后可以从0循环到第1行,为每个单元询问表视图依次使用UITableView cellForRowAtIndexPath方法(与名称相似的数据源方法不同)。该方法将为您提供当前在屏幕上可见的单元格。 然后您可以对这些单元格进行更改。

请注意,这只会给你目前在屏幕上的单元格。 如果目标部分中有其他单元格当前不可见,则这些单元格当前不存在,并且如果用户滚动,则可能会创build其中一些单元格。 由于这个原因,你需要将一些状态信息保存到你的模型中,这样当你在数据源tableView:cellForRowAtIndexPath:方法中设置目标部分的单元格时,你可以正确地设置它们。

回答我自己的问题: “我怎么能遍历所有的UITableCells给出一个部分ID?

要遍历节的所有UITableCells section必须使用两个方法:

  • tableView.numberOfRowsInSection(section)
  • tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section))

所以迭代是这样的:

 // Iterate over all the rows of a section for (var row = 0; row < tableView.numberOfRowsInSection(section); row++) { var cell:Cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section))? // do something with the cell here. } 

在我的问题结尾处,我还写了一个注释:“ 注意:我想以编程方式将AccesoryType设置为None,用于一个节中的所有单元格 ”。 请注意,这是一个笔记,而不是问题。

我最终这样做是这样的:

 // Uncheck everything in section 'section' for (var row = 0; row < tableView.numberOfRowsInSection(section); row++) { tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section))?.accessoryType = UITableViewCellAccessoryType.None } 

如果有更优雅的解决scheme,请继续发布。

注意:我的表使用静态数据。

即时通讯使用相同的方式迭代所有表格视图单元格,但此代码仅用于可见的单元格,所以我只是添加一行允许迭代所有表格视图单元格可见他们是否

  //get section of interest ie: first section (0) for (var row = 0; row < tableView.numberOfRowsInSection(0); row++) { var indexPath = NSIndexPath(forRow: row, inSection: 0) println("row") println(row) //following line of code is for invisible cells tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Top, animated: false) //get cell for current row as my custom cell ie :roomCell var cell :roomCell = tableView.cellForRowAtIndexPath(indexPath) as roomCell } 

*想法是将tableview滚动到我在循环中接收到的每一行,因此,我的每一行都是可见的 – >现在所有的表视图行都可见:D

对于Swift 4,我一直沿用以下的方法,似乎工作得很好。

 for section in 0...self.tableView.numberOfSections - 1 { for row in 0...self.tableView.numberOfRows(inSection: section) - 1 { let cell = self.tableView.cellForRow(at: NSIndexPath(row: row, section: section) as IndexPath) print("Section: \(section) Row: \(row)") } } 

即时通讯使用这种迭代所有表格视图单元格的方式,但是这个代码仅适用于可见的单元格,所以我只需添加一行即可迭代所有表格视图单元格,使其可见或不可见

  //get section of interest ie: first section (0) for (var row = 0; row < tableView.numberOfRowsInSection(0); row++) { var indexPath = NSIndexPath(forRow: row, inSection: 0) println("row") println(row) //following line of code is for invisible cells tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Top, animated: false) //get cell for current row as my custom cell ie :roomCell var cell :roomCell = tableView.cellForRowAtIndexPath(indexPath) as roomCell } 

*的想法是滚动tableview到我在循环中接收的每一行,所以,我的当前行是在每一个可见的 – 所有的表视图行现在可见

你可以使用reloadSections(_:withRowAnimation:)方法。

这将通过调用cellForRowAtIndexPath(_:)来重新加载指定部分中的所有单元格。 在这个方法里面,你可以做任何你想要的单元格。

在你的情况下,你可以运用你的逻辑设置适当的附件types:

 if (self.shouldHideAccessoryViewForCellInSection(indexPath.section)) { cell.accessoryType = UITableViewCellAccessoryTypeNone }