【问题标题】:numberOfRowsInSection called for a section not being reloadednumberOfRowsInSection 调用了未重新加载的部分
【发布时间】: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 如果你解决了这个问题,你介意分享你的最终结果给社区:)

标签: ios swift


【解决方案1】:

numberOfRows(in section:) 可以随时为任何部分调用。

tableview 需要知道其他部分有多少行,以便它可以根据需要调整滚动视图的偏移量。

您的问题是第 0 节的行数由于依赖于 myArray 的内容而意外更改。

当您更新数组时,如果数组计数从零变为非零或从非零变为零,您还需要重新加载第 0 节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多