使用Swift,如何在给定节ID的情况下迭代所有UITableCells
(例如:第2节中的所有单元格)?
我只看到这个方法:tableView.cellForRowAtIndexPath
,它返回给定绝对索引的1个单元格,所以它没有帮助。
有优雅而简单的方法吗?
注意:我想为某个部分中的所有单元格设置AccesoryType为None,以编程方式,例如:单击按钮后或发生某些事件后(发生的事情与问题)
我有UITableView的引用和该部分的索引。
答案 0 :(得分:8)
您误解了表视图的工作原理。如果要更改单元格的配置,不直接修改单元格。相反,您更改这些单元格的数据(模型),然后告诉您的表格视图重新加载更改的单元格。
这是根本性的,如果你试图以另一种方式做到这一点,它就无法正常工作。
你说"我需要修改它们之前的单元格数组......"同样的事情适用。您不应将状态数据存储在单元格中。一旦用户对单元格进行更改,您应该立即收集更改并将其保存到模型中。单元格可以在屏幕外滚动,并且可以随时丢弃它们的设置。
@LordZsolt要求您展示您的代码,因为从您提出的问题来看,很明显您会以错误的方式处理问题。
如果您确信需要遍历某个部分中的单元格,那么您可以向表视图询问目标部分中的行数,然后您可以从0循环到第1行,询问表格视图对于每个单元依次使用UITableView cellForRowAtIndexPath
方法(与类似命名的数据源方法不同)。该方法将为您提供当前在屏幕上可见的单元格。然后,您可以对这些单元格进行更改。
请注意,这只会为您提供当前屏幕上的单元格。如果目标部分中有其他单元格当前不可见,则这些单元格当前不存在,如果用户滚动,则可能会创建其中一些单元格。因此,您需要将某种状态信息保存到模型中,以便在数据源tableView:cellForRowAtIndexPath:
方法中设置目标部分的单元格时,可以正确设置它们。
答案 1 :(得分:6)
对于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)")
}
}
答案 2 :(得分:5)
要回答我自己的问题:“我如何在给定部分ID的情况下迭代所有UITableCells
?”:
要迭代部分section
的所有UITableCell,必须使用两种方法:
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
}
如果有更优雅的解决方案,请继续发布。
注意:我的表使用静态数据。
答案 3 :(得分:2)
我使用这种迭代所有表视图单元格的方式,但是此代码仅适用于可见单元格,所以我只需添加一行就可以迭代所有表格视图单元格是否可见
//get section of interest i.e: 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 i.e :roomCell
var cell :roomCell = tableView.cellForRowAtIndexPath(indexPath) as roomCell
}
*我的想法是将tableview滚动到我在循环中收到的每一行,这样,在每个回合中我的当前行都是可见的 - &gt;所有表视图行现在都可见
答案 4 :(得分:2)
更多&#34; swifty&#34;,比以前的答案。我确信这可以通过函数式编程严格完成。如果我还有5分钟的ID,那就用.reduce代替。 ✌️
func cells(tableView:UITableView) -> [UITableViewCell]{
var cells:[UITableViewCell] = []
(0..<tableView.numberOfSections).indices.forEach { sectionIndex in
(0..<tableView.numberOfRows(inSection: sectionIndex)).indices.forEach { rowIndex in
if let cell:UITableViewCell = tableView.cellForRow(at: IndexPath(row: rowIndex, section: sectionIndex)) {
cells.append(cell)
}
}
}
return cells
}
答案 5 :(得分:0)
你可以使用
UITableView的reloadSections(_:withRowAnimation:)
方法。
这将通过调用cellForRowAtIndexPath(_:)
重新加载指定部分中的所有单元格。在该方法中,您可以对这些单元格执行任何操作。
在您的情况下,您可以应用逻辑来设置适当的配件类型:
if (self.shouldHideAccessoryViewForCellInSection(indexPath.section)) {
cell.accessoryType = UITableViewCellAccessoryTypeNone
}