【发布时间】:2020-12-31 05:51:10
【问题描述】:
在我的 tableview 中,当 section == 0 时,如果所有部分都有零项,我会为用户插入一行帮助文本。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if myArray.flatMap({ $0 }).count == 0 && section == 0 {
return 1 //so we can show empty row helper text
} else {
return myArray[section].count
}
}
当允许用户手动删除行时,除了第 0 节中没有行并且我在其他地方(例如第 1 节)删除唯一剩余行的情况外,这可以正常工作。在这种情况下,帮助文本不会显示。
删除时,我为第 1 节调用 reloadSections。
myTableView.reloadSections([indexPath.section], with: .fade)
我也尝试过 deleteRow 并获得相同的行为。
myTableView.deleteRows(at: [indexPath], with: .fade)
使用上述任何一种方法,我都会崩溃:
'无效更新:第0节的行数无效。 更新 (1) 后包含在现有节中的行必须是 等于该节之前包含的行数 update (0),加上或减去插入或删除的行数 该部分(0 插入,0 删除)和加或减的数量 移入或移出该部分的行(0 移入,0 移出)。'
我收到错误消息 - 部分 0 未被删除,现在有一行(在删除之前它没有)。但是这是怎么发生的/为什么在这种情况下甚至会调用 numberOfRowsInSection(当我故意不重新加载第 0 节时)?
如果我只是完整的 myTableView.reloadData() - 它可以正常工作而不会崩溃 - 但我当然会丢失用户删除行的动画。
想法?
编辑:感谢 PaulW 解决
问题在于,出于布局原因,可以随时为所有部分调用 numberOfRowsInSection。因此,如果我更新第 1 节以删除最后一项,则第 0 节将在重新加载时返回 1。因此,通过在这种情况下主动重新加载第 0 节,我避免了崩溃。
在我的删除行函数中,我现在执行以下操作:
if tempRideArray.flatMap({ $0 }).count == 0 {
myTableView.reloadSections([0,indexPath.section], with: .fade)
} else {
myTableView.deleteRows(at: [indexPath], with: .fade)
}
【问题讨论】:
-
numberOfRows可以随时为任何部分调用。 tableview 需要知道其他部分中有多少行,以便它可以根据需要调整滚动视图偏移量。您的问题是第 0 节的行数由于依赖于myArray的内容而意外更改。当您更新数组时,您还需要重新加载第 0 节。 -
自从我使用这样的东西以来已经有一段时间了,所以请多多包涵。您要删除的项目(来自第 1 节)是阵列中唯一的项目吗?由于消息说第 0 部分获得了一行,这让我认为您从数组中删除了唯一的项目(所以
myArray.flatMap({ $0 }).count == 0),触发numberOfRowsInSection为第 0 部分返回 1。如果这是在这种情况下,我想知道添加对insertRows(at:with:)或reloadSections(_:with:)的调用是否有助于向系统指示该新行。您可能想查看beginUpdates()和endUpdates()。 -
@Paulw11 - 谢谢,成功了。如果你想回答这个问题,我很乐意接受。我通过检查数组在删除后但在重新加载之前是否有零项来解决它。如果是这样,我重新加载第 0 节和删除的部分。如果不是,则只是被删除的行。完美运行。
-
@SteveB 如果你解决了这个问题,你介意分享你的最终结果给社区:)