无法在表格视图中插入行

时间:2016-11-12 10:20:56

标签: ios swift uitableview swift3

我阅读了有关此问题的所有相关帖子,但我仍然遇到错误:

'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()
    }
}

1 个答案:

答案 0 :(得分:3)

看起来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()
    }
}

进行此更改将确保在调用beginUpdates()函数之前,如果UITableView查询节中的行数,或者甚至通过该函数本身,将返回正确的行数。在当前设置中,假设self.items表示表视图数据,更新的行数将在调用beginUpdates()之前显示。如果这不起作用,则需要更多代码来查明问题。