Выбор каждой строки в TableView, включая строки вне экрана - PullRequest
0 голосов
/ 17 апреля 2019

Сейчас я могу выбрать все строки, видимые на экране, но я хочу иметь возможность выбрать все строки в TableView, включая строки вне экрана.

Я попробовал расширение здесь: программно выделил все ячейки в табличном представлении, поэтому при следующем нажатии они вызывают didDeselect

Как и второе решение здесь: Выбор программно ВСЕХ строк TableView с использованием selectRowAtIndexPath

Оба заканчиваются одинаковыми результатами, выбираются только видимые строки.

Моя конечная цель - когда я могу выбрать все строки, я могу затем нажать кнопку «Подтвердить», которая получает идентификатор для каждой строки, а затем отправляет его на сервер, который я уже могу Выполните, мне просто нужно выяснить, как выбрать ВСЕ строки, чтобы я мог получить этот список идентификаторов.

Спасибо за помощь!

Добавлена ​​структура источника данных

var dataClassArr = [DataClass]()

struct DataClass: Codable {
    let id: String
}

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы не .

Вы не можете выбрать все ячейки, потому что они используются повторно, что означает, что существует только достаточное количество ячеек.

Когда "При нажатии кнопки «Подтвердить» вы можете получить данные из своего источника данных, который вы потребляете для создания 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.
0 голосов
/ 17 апреля 2019

Предположим, что источником данных UITableView является

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

Вы должны выбрать все идентификаторы из вышеуказанного источника данных, например так:

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

Если вам нужно изменить пользовательский интерфейс, чтобы выбрать UITableViewCell s, вы должны создать новое свойство 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
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...