无法使用动态数量的Sections And Rows向UITableView插入新行

问题描述 投票:0回答:3

我有一个tableView,其中包含动态的节数,每个节都有动态的行数。

我的数据源数组看起来像这样

var detailsList = [[Any]]()

但是我知道将添加到列表中的类型,它们将按特定顺序添加。让我们考虑这些类型将是A,B,C。

根据API的数据的可用性,将填充detailsList。因此数组看起来像这样:

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

在此示例中,tableView有3个部分,numberOfRows依赖于子数组计数。

以下是dataSource的外观

    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]]

添加新部分后,dataSource看起来像这样

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()它按预期工作。

是否有另一种插入新部分的方法?

ios swift uitableview
3个回答
0
投票

正如错误消息所示,您正在尝试插入更多行,但您的数组告诉您的是您需要更多部分。你应该使用:

tableView.insertSections(sections: IndexSet, with: UITableViewRowAnimation)

0
投票

您正在添加一个部分,因此您需要使用

let indexSet = IndexSet( integer:4)
tableView.insertSections( indexSet, with:.fade)

0
投票

问题是你应该在'beginUpdates'和'endUpdates'方法调用中调用insertRows方法,如下所示:

//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

© www.soinside.com 2019 - 2024. All rights reserved.