无法在表格视图中插入行

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 基本上你应该确保numberOfSectionsnumberOfRows 方法返回更新的值。 【参考方案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 的位置对我有用。非常感谢!

以上是关于无法在表格视图中插入行的主要内容,如果未能解决你的问题,请参考以下文章

通过滑动删除行在表格视图中无法正常工作

如何根据插入的行数设置表格视图的高度

将视图插入表格 - 视图不需要很长时间才能运行 - 插入需要很长时间

无法从自定义表格视图单元格按钮中删除行

在 SwiftUI 视图中插入非列表元素

无法从布局中删除视图