swift 迭代给定节ID的所有UITableCells

fjnneemd  于 2022-12-26  发布在  Swift
关注(0)|答案(8)|浏览(92)

使用Swift,如何迭代给定section id的所有UITableCells(例如:第2节中的所有单元格)?
我只看到这个方法:tableView.cellForRowAtIndexPath,在给定绝对索引的情况下返回1个单元格,因此没有帮助。
有没有一个优雅而简单的方法?
注意:我想为一个节中的所有单元格将AccessoryType设置为None,以编程方式,例如:单击按钮后,或发生某些事情后(发生的事情与问题无关)
我有UITableView的引用和该节的索引。

xoefb8l8

xoefb8l81#

您误解了表格视图的工作方式。当您想要更改单元格的配置时,您直接修改单元格。而是更改这些单元格的数据(模型),然后告诉表格视图重新加载更改的单元格。
这是最基本的,如果你试图用另一种方式来做,它就不会正确地工作。
您说"在修改单元格之前,我需要它们的数组......"同样的道理也适用。您不应该在单元格中存储状态数据。一旦用户对单元格进行更改,您应该收集更改并将其保存到模型中。单元格可以滚动到屏幕外,并且可以随时放弃其设置。
@LordZsolt要求你展示你的代码,因为从你问的问题来看,很明显你的方式是错误的。

编辑:

如果您确信需要迭代某个部分中的单元格,则可以向表视图询问目标部分中的行数,然后可以从0循环到rows-1,使用UITableView cellForRowAtIndexPath方法依次向表视图询问每个单元格(这与名称相似的数据源方法不同。)该方法将为您提供当前在屏幕上可见的单元格。然后,您可以对这些单元格进行更改。
请注意,这只会显示当前在屏幕上的单元格。如果目标节中有其他单元格当前不可见,则这些单元格当前不存在,并且如果用户滚动,可能会产生一些这样的细胞。因此,您需要将某种状态信息保存到模型中,以便在数据源tableView:cellForRowAtIndexPath:中设置目标部分的单元格时方法,您可以正确设置它们。

13z8s7eq

13z8s7eq2#

对于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)")

            }
        }
w1e3prcc

w1e3prcc3#

我使用相同的方式迭代所有的表格视图单元格,但这段代码只适用于可见的单元格,所以我只添加一行允许迭代所有的表格视图单元格,无论它们是否可见

//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到我在循环中收到的每一行,这样,在每一轮我的当前行是可见的-〉所有的表视图行现在是可见的:D
cvxl0en2

cvxl0en24#

回答我自己的问题:* “如何迭代给定section id的所有UITableCells?"*:
要迭代section部分的所有UITableCells,必须使用两个方法:

  • 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.
}

在我提问的最后,我还写了一张纸条:“* 注意:我希望以编程方式将节中所有单元格的AccessoryType设置为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
}

如果有更优雅的解决方案,请继续发布。
注意:我的表使用静态数据。

2cmtqfgy

2cmtqfgy5#

雨燕4

比之前的答案更“迅速”。我确信这可以用函数式编程来完成。如果我有5分钟多的时间,我会用.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
}
irlmq6kh

irlmq6kh6#

我使用这种方式迭代所有的表格视图单元格,但这段代码只适用于可见的单元格,所以我只添加一行允许迭代所有的表格视图单元格,无论它们是否可见

//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到我在循环中接收的每一行,这样,在每一轮中,我的当前行都是可见的-〉所有tableview行现在都是可见的
bejyjqdl

bejyjqdl7#

您可以使用UITableView的reloadSections(_:withRowAnimation:)方法。
这将通过调用cellForRowAtIndexPath(_:)重新加载指定部分中的所有单元格。在该方法中,您可以对这些单元格执行任何您想要的操作。
在您的情况下,您可以应用您的逻辑来设置适当的附件类型:

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

pkwftd7m8#

我写了一个基于Steve's answer的简单扩展,返回指定区域中给定类型的第一个单元格(如果有的话)。

extension UITableView {
  func getFirstCell<T: UITableViewCell>(ofType type: T.Type, inSection section: Int = 0) -> T? {
    for row in 0 ..< numberOfRows(inSection: section) {
      if let cell = cellForRow(at: IndexPath(row: row, section: section)) as? T {
        return cell
      }
    }
    return nil
  }
}

相关问题