为什么执行insertRows后,tableview numberOfRowsInSection没有更新?

时间:2019-07-18 14:36:58

标签: ios swift uitableview

我正在将反向tableView与TableView.transform = CGAffineTransform (scaleX: 1,y: -1)和反向tableViewCell一起使用,并通过insertRowsdeleteRows方法进行更新。如果在tableView的可见区域中进行插入和删除,则tableView可以正常工作。如果未在可见区域中执行更新方法,则会崩溃。

func insertEntries(){
        if itemsToInsert.count == 0{
            return
        }
        let entry = itemsToInsert.first
        itemsToInsert.removeFirst()
        dataArray.append(entry!)

        let indexPath = IndexPath(row: 0, section: 0)
        tableView.beginUpdates()

        tableView.insertRows(at: [indexPath], with: UITableView.RowAnimation.bottom)

        tableView.endUpdates()
        insertEntries()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }

错误是:

  

更新后现有部分中包含的行数   (50)必须等于该节中包含的行数   在更新(47)之前,加上或减去插入的行数,或者   从该部分中删除(已插入1个,已删除0个)并加上或减去   移入或移出该部分的行数(移入0,0   移出)。

谢谢

2 个答案:

答案 0 :(得分:0)

您需要在TtableView.beginUpdates()之间执行模型更新,仅在那里进行tableView.endUpdates()更新可能会导致问题。

此外,您要插入行的索引与插入项目的索引也不匹配。您将追加到tableView的末尾,但要插入dataArray

可以检查一下是否解决了您的问题?

IndexPath(row: 0, section:0)

答案 1 :(得分:0)

您目前的代码实际上并不会执行多个动画,因为所有动画实际上都是同时创建的。

尽管如此,该代码仍应在理论上起作用。但是实际上,UITableView实现中存在一些奇怪的事情,这些事情使类似的事情很难执行,而对于没有这些问题的UICollectionView来说,它会容易得多。

还请注意,您要追加一个项目,但尝试插入第一行。这显然是不正确的。

修复代码的一种方法是在上一个动画结束之前才触发动画,这可能是您真正想要做的:

func insertEntries(){
    guard !itemsToInsert.isEmpty else {
        return
    }

    let entry = itemsToInsert.removeFirst()
    dataArray.append(entry)

    let indexPath = IndexPath(row: dataArray.count - 1, section: 0)
    tableView.beginUpdates()
    CATransaction.setCompletionBlock { [weak self] in
        self?.insertEntries()
    }

    tableView.insertRows(at: [indexPath], with: .bottom)

    tableView.endUpdates()        
}

如果您不想在一行之后设置动画,这可能需要花费大量时间处理多个项目,所以我可以简化为:

func insertEntries(){
    guard !itemsToInsert.isEmpty else {
        return
    }

    dataArray.append(contentsOf: itemsToInsert)
    let numItems = itemsToInsert.count
    itemsToInsert = []

    let addedRows = Array((dataArray.count - numItems) ..< dataArray.count)
        .map { IndexPath(row: $0, section: 0 })

    tableView.beginUpdates()
    tableView.insertRows(at: addedRows, with: .bottom)
    tableView.endUpdates()        
}