我有一个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()
可以正常工作。
还有另一种插入新部分的方法吗?
答案 0 :(得分:0)
您要添加一个部分,因此需要使用
let indexSet = IndexSet( integer:4)
tableView.insertSections( indexSet, with:.fade)
答案 1 :(得分:0)
错误消息告诉您,您尝试插入更多行,但是数组告诉您的是您需要更多节。您应该为此使用:
tableView.insertSections(sections: IndexSet, with: UITableViewRowAnimation)
答案 2 :(得分: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
。