在给定节ID的情况下迭代所有UITableCell

时间:2015-05-16 22:36:12

标签: ios swift uitableview

使用Swift,如何在给定节ID的情况下迭代所有UITableCells(例如:第2节中的所有单元格)?

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

有优雅而简单的方法吗?

注意:我想为某个部分中的所有单元格设置AccesoryType为None,以编程方式,例如:单击按钮后或发生某些事件后(发生的事情与问题)

我有UITableView的引用和该部分的索引。

6 个答案:

答案 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)

Swift 4

更多&#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
}