我正在将反向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 移出)。
谢谢
答案 0 :(得分:0)
您需要在T
和tableView.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()
}