无法在表格视图中插入行
Posted
技术标签:
【中文标题】无法在表格视图中插入行【英文标题】:Can't insert rows in table view 【发布时间】:2016-11-12 10:20:55 【问题描述】:我阅读了有关此问题的所有相关帖子,但仍然遇到错误:
'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (13) must be equal to the number of rows contained in that section before the update (13), plus or minus the number of rows inserted or deleted from that section (11 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
代码如下:
func appendItems(entities: [Entity])
if entities.count > 0
let entitesFirstPos = items.count
self.items.append(contentsOf: entities)
var indexPaths: [IndexPath] = []
for i in entitesFirstPos..<items.count
indexPaths.append(IndexPath(row: i, section: 0))
self.tableView.beginUpdates()
self.tableView.insertRows(at: indexPaths, with: .none)
self.tableView.endUpdates()
【问题讨论】:
我认为 UITableView 的委托方法是做这些事情的更好地方。 @Vanya 有什么用? 您还应该在每次在 tableView 中插入或删除行时更新您的数据源。检查此答案以获取更多详细信息:***.com/a/40072874/1689376 基本上你应该确保numberOfSections
和numberOfRows
方法返回更新的值。
【参考方案1】:
看起来 appendItems() 是 UITableViewController 子类中的一个函数。如果是这种情况,请尝试以下操作。如果不知道您的 tableView(UITableView, numberOfRowsInSection: Int) 和 tableView(UITableView, cellForRowAt: IndexPath) 是什么样子,就不可能给出准确的答案。所以这是基于 self.items 只是一个包含第 0 节中所有单元格数据的数组的假设。
首先尝试进行此更改:
//self.tableView.beginUpdates()
//self.tableView.insertRows(at: indexPaths, with: .none)
//self.tableView.endUpdates()
self.tableView.reloadData()
进行该更改将更新您的表格视图,而无需将行插入动画作为所有新行的批处理执行。如果这有效,您的问题就在 appendItems() 函数中。在这种情况下,请尝试进行以下更改:
func appendItems(entities: [Entity])
if entities.count > 0
self.tableView.beginUpdates() // <--- Insert this here
let entitesFirstPos = items.count
self.items.append(contentsOf: entities)
var indexPaths: [IndexPath] = []
for i in entitesFirstPos..<items.count
indexPaths.append(IndexPath(row: i, section: 0))
//The following line is now at the top of the block.
//self.tableView.beginUpdates()
self.tableView.insertRows(at: indexPaths, with: .none)
self.tableView.endUpdates()
进行此更改将确保如果 UITableView 在调用 beginUpdates() 函数之前或什至由该函数本身查询部分中的行数,则将返回正确的行数。在您当前的设置中,假设 self.items 表示表视图数据,更新的行数将在 beginUpdates() 被调用之前已经可见。如果这不起作用,则需要更多代码来查明问题。
【讨论】:
改变 beginUpdates 的位置对我有用。非常感谢!以上是关于无法在表格视图中插入行的主要内容,如果未能解决你的问题,请参考以下文章