以编程方式选择表格视图中的所有单元格,以便下次按下它们时调用 didDeselect

Posted

技术标签:

【中文标题】以编程方式选择表格视图中的所有单元格,以便下次按下它们时调用 didDeselect【英文标题】:programmatically select all cells in tableview so next time they are pressed they call didDeselect 【发布时间】:2017-05-02 20:26:25 【问题描述】:

我有一个表格视图,其中包含一堆不同的部分和每个部分中的动态行数。在第一部分,我有一个单元格可以“全选”。是否有一种快速简便的方法来手动选择所有单元格,以便其didSelect 中的代码触发,并且下次用户按下其中一个单元格时,它会触发其didDeselect?我现在能想到的唯一方法是遍历所有部分,并在每个部分中循环通过0 < indexPath.row < section's data array count 并调用

self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

但是有没有办法在没有这么多循环的情况下做到这一点?

【问题讨论】:

跟踪数据源中每个单元格的选定状态不是更好吗? 你不应该自己打电话给didSelectRowAt。那是为了让你知道用户做了什么。当您显式调用 selectRow 时,这是没有意义的,因为您已经知道该行已被选中。 【参考方案1】:

;没有循环就没有办法做到这一点。你可以通过扩展UITableView 来让自己更轻松一些,并为你做这件事。应该这样做:

extension UITableView 

    func selectAll(animated: Bool = false) 
        let totalSections = self.numberOfSections
        for section in 0 ..< totalSections 
            let totalRows = self.numberOfRows(inSection: section)
            for row in 0 ..< totalRows 
                let indexPath = IndexPath(row: row, section: section)
                // call the delegate's willSelect, select the row, then call didSelect
                self.delegate?.tableView?(self, willSelectRowAt: indexPath)
                self.selectRow(at: indexPath, animated: animated, scrollPosition: .none)
                self.delegate?.tableView?(self, didSelectRowAt: indexPath)
            
        
    


只需将其添加到根级别的任何 Swift 文件中,然后您就可以在任何 UITableView 上调用 tableView.selectAll()

【讨论】:

很棒的解决方案! ,在 Swift 5 中工作得很好谢谢【参考方案2】:

NSTableView 有一个selectAll 方法。

【讨论】:

这是关于 iosUITableView.

以上是关于以编程方式选择表格视图中的所有单元格,以便下次按下它们时调用 didDeselect的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式删除表格视图单元格中的 UIView?

以编程方式动态调整多行 UILabel 和随附的表格视图单元格

以编程方式开始在另一个表格视图单元格中编辑 UITextField

以编程方式选择单元格并转到 tabbarcontroller

以编程方式选择不在当前视图中的 UITableView 单元格

如何以编程方式关闭展开的表格视图单元格?