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

时间:2019-04-17 17:27:17

标签: swift uitableview

现在,我可以选择屏幕上可见的所有行,但是我希望能够选择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
}

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

假设您的UITableView的数据源是

struct Item {
    id: Int
}
var dataSource: [Item] = []

您应该从上面的数据源中选择所有ID,如下所示:

let result = dataSource.map{ $0.id }

如果您需要更改用户界面以选择UITableViewCell,则必须在结构中创建一个新属性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
    }

}