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

spo*_*rts 4 uitableview ios swift

使用Swift,我如何迭代所有UITableCells给定的节id(例如:第2节中的所有单元格)?

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

有一种优雅而简单的方法吗?

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

我有UITableView的参考和该部分的索引.

Dun*_*n C 8

您误解了表视图的工作原理.如果要更改单元格的配置,请不要直接修改单元格.而是更改这些单元格的数据(模型),然后告诉表视图重新加载已更改的单元格.

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

你说"我需要修改它们之前的单元格数组......"同样适用.您不应将状态数据存储在单元格中.一旦用户对单元格进行更改,您应该立即收集更改并将其保存到模型中.单元格可以在屏幕外滚动,并且可以随时丢弃它们的设置.

@LordZsolt要求你展示你的代码,因为从你提出的问题来看,很明显你会以错误的方式处理事情.

编辑:

如果您确信需要遍历某个部分中的单元格,那么您可以向表视图询问目标部分中的行数,然后您可以从0循环到第1行,询问每个单元格的表视图反过来使用UITableView cellForRowAtIndexPath方法(与类似命名的数据源方法不同.)该方法将为您提供当前在屏幕上可见的单元格.然后,您可以对这些单元格进行更改.

请注意,这只会为您提供当前屏幕上的单元格.如果目标部分中有其他单元格当前不可见,则这些单元格当前不存在,如果用户滚动,则可能会创建其中一些单元格.因此,您需要将某种状态信息保存到模型中,以便在数据源tableView:cellForRowAtIndexPath:方法中从目标部分设置单元格时可以正确设置它们.

  • @Schemetrical:解释为什么一种方法无效或不明智的答案,*然后至少在某种程度上解释了做什么而不是*,是完全合法的.这是一个答案. (4认同)
  • 这并没有提供问题的答案.要对作者进行批评或要求澄清,请在帖子下方留言. (2认同)

小智 6

我使用相同的方式迭代所有表视图单元格,但此代码仅适用于可见单元格,所以我只需添加一行就可以迭代所有表格视图单元格是否可见它们是否可见

   //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
      }
Run Code Online (Sandbox Code Playgroud)

*我的想法是将tableview滚动到我在循环中收到的每一行,这样,在每个回合中我的当前行都是可见的 - >现在所有的表视图行都可见:D


Ste*_*eve 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)")

            }
        }
Run Code Online (Sandbox Code Playgroud)


spo*_*rts 5

回答我自己的问题:"如何迭代所有UITableCells给定的节ID?" :

要迭代部分的所有UITableCell,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.
}
Run Code Online (Sandbox Code Playgroud)

在我的问题的最后,我还写了一个注释:" 注意:我想以编程方式将一个部分中的所有单元格的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
}
Run Code Online (Sandbox Code Playgroud)

如果有更优雅的解决方案,请继续发布.

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