Невозможно вставить новую строку в UITableView с динамическим числом разделов и строк - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть tableView с динамическим количеством разделов, и у каждого раздела есть динамическое количество строк.

Мой массив источников данных выглядит так

var detailsList = [[Any]]()

Однако я знаю тип, который будет добавлен в список, и они будут добавлены в определенном порядке. Давайте рассмотрим эти типы будут A, B, C.

В зависимости от доступности данных из API будет заполнено detailsList. Следовательно, массив будет выглядеть примерно так:

[[A, A, A, A], [B, B, B], [C, C, C]]

В этом примере tableView имеет 3 секции, а numberOfRows зависит от количества подмассивов.

Вот как выглядит источник данных

    extension ViewController: UITableViewDataSource {
            func numberOfSections(in tableView: UITableView) -> Int {
                return detailsList.count
            }

            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return detailsList[section].count
            }

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
               if let _ = detailsList[indexPath.section] as? [A] {
                  return cellA
               } else if let _ = detailsList[indexPath.section] as? [B] {
                 return cellB
               } else if let _ = detailsList[indexPath.section] as? [C] {
                 return cellC
                } else if let _ = detailsList[indexPath.section] as? [D] {
                 return cellD
                }
 }

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу вставить раздел.

Допустим, DataSource перед добавлением массива выглядит следующим образом

detailsList = [[A, A, A, A], [B, B, B], [C, C, C]]

После добавления нового раздела источник данных выглядит следующим образом

detailsList = [[A, A, A, A], [B, B, B], [C, C, C], [D, D, D, D]]

Я не могу сказать

tableView.insertRows(at: [indexPath], with: .none)

Приложение вылетает со следующим исключением

Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недействительно количество разделов. Количество разделов, содержащихся в таблице вид после обновления (4) должен быть равен числу секций содержится в табличном представлении до обновления (3), плюс или минус количество вставленных или удаленных разделов (0 вставлено, 0 удалено). '

Но если я скажу

tableView.reloadData() работает как положено.

есть ли другой способ вставить новый раздел?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

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

tableView.insertSections(sections: IndexSet, with: UITableViewRowAnimation)
0 голосов
/ 04 сентября 2018

Проблема в том, что вы должны вызывать insertRows метод внутри вызовов методов beginUpdates и endUpdates следующим образом:

//update the array first
detailsList = [[A, A, A, A], [B, B, B], [C, C, C], [D, D, D, D]]

//call insert method inside begin and end updates
tableView.beginUpdates()
tableView.insertRows(at: [indexPath], with: .none)
tableView.endUpdates()

UPD: Существует специальный метод insertSections при добавлении раздела вместо строки.

0 голосов
/ 04 сентября 2018

Вы добавляете раздел, поэтому вам нужно использовать

let indexSet = IndexSet( integer:4)
tableView.insertSections( indexSet, with:.fade)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...