ios - 为什么执行insertRows后,tableview numberOfRowsInSection不更新?

标签 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
搬出)。

谢谢

最佳答案

照原样,您的代码实际上并不会做多个动画,因为所有动画实际上都是同时创建的。

但是,该代码应在理论上起作用。但是在实践中,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()        
}

关于ios - 为什么执行insertRows后,tableview numberOfRowsInSection不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57097086/

相关文章:

ios - 如何使用 VLC 从 iOS 设备广播本地视频并通过同一 WiFi 网络中的其他 iOS 设备接收视频流?

ios - UITableViewCell 中的 UIButton 标题在重用时发生变化

ios - 从 URL 下载图像时 Nsurlsession 内存泄漏

ios - 如何检查计时器是否小于某个值然后运行函数?

ios - objectAtIndex :indexPath. 行方法在 IOS 中总是导致异常

ios - 返回表中的单元格数会产生 NSInternalInconsistenceyException

ios - 如何在iOS中创建复选框?

php - iOS URLSession 错误 "JSON text did not start with array or object and option to allow fragments not set."

swift - Swift 中用于登录的 HTTP POST-Request 返回 "MISSING_USERNAME"作为响应

ios - 在 UITableViewCell 中调用 UIAlertController