迭代所有的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 }