gpt4 book ai didi

ios - 如何修复 TableView 中的跳跃单元格?

转载 作者:可可西里 更新时间:2023-11-01 01:08:35 27 4
gpt4 key购买 nike

有一个问题,我无法解决,即 - 我与将新单元格添加到表格 (tableView.insertRows) 的流畅动画作斗争。下面的视频显示了所有细胞在开始时是如何疯狂抽动的,我对代码进行了编码:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if (destinationData?[indexPath.row]) != nil {
return 110
} else {
return 95
}
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if (destinationData?[indexPath.row]) != nil {
if(indexPath.row + 1 >= (destinationData?.count)!) {
expandCell(tableView: tableView, index: indexPath.row)
}
else {
if(destinationData?[indexPath.row+1] != nil) {
expandCell(tableView: tableView, index: indexPath.row)
// Close Cell (remove ExpansionCells)
} else {
contractCell(tableView: tableView, index: indexPath.row)
}
}
}
}

private func expandCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
for i in 1...infoMain.count {
destinationData?.insert(nil, at: index + 1)
tableView.insertRows(at: [IndexPath(row: index + i, section: 0)] , with: .bottom)
}
}
}

private func contractCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
for _ in 1...infoMain.count {
destinationData?.remove(at: index + 1)
tableView.deleteRows(at: [IndexPath(row: index + 1, section: 0)], with: .top)
}
}
}

VIDEO

最佳答案

如果您对 tableview 内容进行多次动画更改,您应该将它们全部包装到 tableView.beginUpdates() ... tableView.endUpdates() 调用中。您正在 for...in 循环中进行多次插入或删除。将您的代码更改为:

private func expandCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
tableView.beginUpdates()
for i in 1...infoMain.count {
destinationData?.insert(nil, at: index + 1)
tableView.insertRows(at: [IndexPath(row: index + i, section: 0)] , with: .bottom)
}
tableView.endUpdates()
}
}

private func contractCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
tableView.beginUpdates()
for _ in 1...infoMain.count {
destinationData?.remove(at: index + 1)
tableView.deleteRows(at: [IndexPath(row: index + 1, section: 0)], with: .top)
}
tableView.endUpdates()
}
}

更好的方法是将要更改的 IndexPath 累积到数组中并一次执行所有插入或删除操作:

private func expandCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
var indexesToInsert = [IndexPath]()
for i in 1...infoMain.count {
destinationData?.insert(nil, at: index + 1)
indexesToInsert.append(IndexPath(row: index + i, section: 0))
}
tableView.insertRows(at: indexesToInsert, with: .bottom)
}
}

private func contractCell(tableView: UITableView, index: Int) {
if let infoMain = destinationData?[index]?.infoMain {
var indexesToDelete = [IndexPath]()
for _ in 1...infoMain.count {
destinationData?.remove(at: index + 1)
indexesToDelete.append(IndexPath(row: index + 1, section: 0))
}
tableView.deleteRows(at: indexesToDelete, with: .top)
}
}

关于ios - 如何修复 TableView 中的跳跃单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51534688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com