【问题标题】:performBatchUpdates after viewDidDisppear causing error?viewDidDisppear 后 performBatchUpdates 导致错误?
【发布时间】:2016-08-31 09:58:23
【问题描述】:

我在打电话

performBatchUpdates({
            self.insertItemsAtIndexPaths(indexPathes)
            },
            completion: {
                _ in
        })

在控制器中不可见的集合视图上!已经有另一个视图控制器推到它上面。

这会导致以下错误:

Invalid update: invalid number of items in section 0.  The number of items contained in an existing section after the update (12) must be equal to the number of items contained in that section before the update (12), plus or minus the number of items inserted or deleted from that section (12 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'

但这根本不是真的,因为如果我在视图可见时调用 performBatchUpdates 它将完美运行。

到底发生了什么?

编辑: 请注意,如果我调用 reloadData 它工作正常,而视图不可见。苹果对此有什么看法?

我怎样才能捕捉到这个异常。所以我可以用 reloadData 代替?

编辑: 我在调用 performBachUpdates 之前打印了以下内容:

print("visibleCells().count :"  + String(self.visibleCells().count))
print("dataModel count:" + String(self.dataArray.count))

这是我得到的:

visibleCells().count :0
dataModel count:12

表示异常不成立!!

【问题讨论】:

  • 您需要更新数据模型以匹配您插入到集合视图中的项目。
  • @rmaddy 谢谢你的评论。我在调用 insetItemIndexPath 之前更新了数据模型。
  • @rmaddy 这很好用,但是视图控制器应该是可见的!!
  • 您应该仅在视图可见时更新它。那就是当您弹回视图控制器时,您正在执行此批量更新。尝试在视图中执行它。
  • @AbinGeorge 感谢您的回复,我使用 reloadData 功能。它为什么有效?苹果在文档中提到过吗

标签: ios uicollectionview ios9


【解决方案1】:

正如 @rmaddy 在 cmets 中提到的,您的问题是您没有正确更新数据模型。
您为 indexPathes(包含 12 个索引)调用 insertItemsAtIndexPaths,但您的数据模型以 12 个索引开始,并在批量更新后以 12 个索引结束。您只需在数据模型中插入某些内容时调用 insert(例如,在调用类似于 dataModel.insert("whatever", atIndex: 0) 的内容后,您还可以调用索引为 0 的 insertItemsAtIndexPaths)。
这里似乎不是这种情况,因为你最终得到了相同数量的元素(12)。在这种情况下,如果你想刷新集合视图,你需要调用reloadData(或者如果数据没有改变就不要调用任何东西)

reloadData 不会抛出此类异常,因为它不会添加/删除任何内容,它只会获取您在数据源中提供的任何内容。 insertItemsAtIndexPaths 可以为更改设置动画,因此它会检查您的数据模型(无论您在数据源中提供什么)是否添加了新元素,否则会引发异常。
捕获异常(使用@try/catch)不会让您走得太远,因为它会使更新处于某种奇怪的状态,从而导致进一步的问题。

【讨论】:

  • 感谢您的回答,但事实并非如此。我已经编辑了这个问题。可以看到dataModel被正确填充了
  • visibleCells 与您的数据模型无关。 visibleCells 将始终小于您的数据模型,它可能是 0 或 3 或 12(只要 12 个元素适合屏幕)或介于两者之间的任何值。重要的是numberOfItemsInSection 在更新之前和之后显示的内容(这基于您通过UICollectionViewDataSourcecollectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) 提供的内容。
  • alexi,我很确定这是 ios 中的错误。数据模型和索引路径匹配。无论如何感谢您的努力
  • @david - 异常不检查索引,它只关心插入和删除了多少项目(它检查批量更新前后的单元格总数)。如果您的集合视图有 12 个单元格,并且您告诉它插入另一个单元格(在任何索引处),那么在更新后它将有 13 个单元格。
  • 是的,我知道,但这里不是这样。在插入新项目之前,我已经清除了集合。我做完 。我只是用 reloadData 替换它。谢谢
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多