我正在将反向tableView与TableView.transform = CGAffineTransform (scaleX: 1,y: -1)
和反向tableViewCell
一起使用,并通过insertRows
和deleteRows
方法对其进行更新。如果在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/