选择 TableView 中的每一行,包括屏幕外的行

Posted

技术标签:

【中文标题】选择 TableView 中的每一行,包括屏幕外的行【英文标题】:Selecting every row in TableView including off-screen rows 【发布时间】:2019-04-17 17:27:17 【问题描述】:

现在,我可以选择屏幕上可见的所有行,但我希望能够选择 TableView 中的所有行,包括屏幕外的行。

我在这里尝试过扩展:programmatically select all cells in tableview so next time they are pressed they call didDeselect

这里还有第二种解决方案:Select ALL TableView Rows Programmatically Using selectRowAtIndexPath

两者都以相同的结果结束,只选择了可见的行。

我的最终目标是,当我能够选择所有行时,我可以按下“确认”按钮并检索每行的 ID,然后将其发送到服务器,我已经能够完成后,我只需要弄清楚如何选择所有行,这样我就可以获得 ID 列表。

感谢您的帮助!

新增数据源结构

var dataClassArr = [DataClass]()

struct DataClass: Codable 
    let id: String

【问题讨论】:

从数据源(数组)中获取所有ID不是更容易吗? @JoakimDanielson 我什至没有想到!我会继续尝试。谢谢。 【参考方案1】:

没有

您不能选择所有单元格,因为它们正在被重复使用,这意味着只有足够的单元格存在。

当按下“确认”按钮时,您可以从数据源中获取数据,您正在使用该数据源来创建UITableView


注意:如果按下该按钮时状态发生变化,您应该遍历您的数据源并更新您的对象。然后你.reloadData()


根据您的问题更新进行更新,这就是您遍历数据源的方式。

        var dataClassArr = [DataClass]()

        var result = [String]()

        dataClassArr.append(DataClass(id: "1"))
        dataClassArr.append(DataClass(id: "42")) // just for example, you should remove those.

        for element in dataClassArr 
            result.append(element.id)
        

        print(result) // ["1", "42"] -> based on example values.

【讨论】:

感谢您的建议,我会继续尝试! 嗯,我似乎无法弄清楚如何访问我的 Codable 结构来访问所有 ID。我该怎么做呢?我很快就会用我的结构更新我的问题。 它是dataClassArr,您想向后端发送什么?您可以创建 [String]() 并遍历 dataClassArr,将每个 id 附加为字符串。 是的,这正是我想要的,但是我将如何遍历 dataClassArr ,因为它是 Codable ?我找到了没有 Codable 的结构示例,尝试了这些但没有用。 非常感谢!这正是我所需要的!【参考方案2】:

假设你UITableView的数据源是

struct Item 
    id: Int

var dataSource: [Item] = []

您应该从上述数据源中选择所有 id,如下所示:

let result = dataSource.map $0.id 

如果您需要更改用户界面以选择UITableViewCells,您必须在结构中创建一个新属性isSelected,因为您不能更改UITableViewCell 的选择状态那是不可见的,所以从添加新属性开始:

struct Item 
    id: Int
    var isSelected = false

现在你将使用上面的数据源来改变选择状态,像这样

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var tableView: UITableView!

    private var dataSource = [Item]()

    override func viewDidLoad() 
        super.viewDidLoad()

        self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Toggle", style: .plain, target: self, action: #selector(selectAllAction))
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Acknowledge", style: .plain, target: self, action: #selector(acknowledgeAction))

        self.tableView.allowsMultipleSelection = true
        self.tableView.dataSource = self
        self.tableView.delegate = self
    

    @objc func selectAllAction() 
        let totalRows = self.dataSource.count
        let isSelectAll = self.dataSource.first(where:  !$0.isSelected ) != nil
        for index in 0..<totalRows 
            self.dataSource[index].isSelected = isSelectAll
        
        self.tableView.visibleCells.forEach 
            $0.setSelected(isSelectAll, animated: true)
        
    

    @objc func acknowledgeAction() 
        let result = self.dataSource.compactMap $0.isSelected ? $0.id : nil 
        print(result)

        guard !result.isEmpty else  return 

        // send selected id(s) to the server
    

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
        cell.isSelected = self.dataSource[indexPath.row].isSelected
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        self.dataSource[indexPath.row].isSelected = true
    

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
        self.dataSource[indexPath.row].isSelected = false
    


【讨论】:

以上是关于选择 TableView 中的每一行,包括屏幕外的行的主要内容,如果未能解决你的问题,请参考以下文章

选择表格中的单元格无法正常工作

为选择中的每一行调用一个函数 - Postgres

在Python中的数据框中的每一行的两个子字符串之间选择字符串

如何为 T-SQL 选择中的每一行生成一个随机数?

是否可以在单个查询中选择表 1 中的所有行和表 2 中的每一行元数据?

如何为 LIstView 中的每一行添加一个按钮?