【问题标题】:UICollectionView setCollectionViewLayout error validateLayoutInRectUICollectionView setCollectionViewLayout 错误 validateLayoutInRect
【发布时间】:2014-04-11 13:45:33
【问题描述】:

我有两个自定义布局的 collectionView,如果发生某些操作,我将从数据源中删除两个项目并尝试设置不同的集合视图

    [self.tabCollectionView setCollectionViewLayout:self.basicFlowLayout animated:NO];

我收到错误:

*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2935.137/UICollectionViewData.m:357
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0xbcecd60> {length = 2, path = 0 - 4}'

但是,当我只删除一项后这样做时,动画效果很好。 iOS 7上也没有问题。 一整天都在苦苦挣扎,找不到合适的解决方案来解决它。 有什么想法吗?

【问题讨论】:

标签: ios ios7 uicollectionview


【解决方案1】:

我认为问题在于您在短时间内对集合视图进行了多次更改,导致其状态在某些情况下不一致。

尝试在 performBatchUpdates:completion: 调用中对所有插入/删除/更改布局更改进行分组:

讨论

您可以在您想要制作的情况下使用此方法 在一个动画中对集合视图进行多次更改 操作,而不是在几个单独的动画中。你可能会使用 此方法插入、删除、重新加载或移动单元格或使用它来 更改与一个或多个单元格关联的布局参数。采用 在updates参数中传入的blocked指定了所有的 您要执行的操作。

在批处理操作中,在插入之前处理删除。这表示 插入的索引相对于索引进行处理 批处理操作前的状态,以及 毕竟删除是相对于状态的索引进行处理的 批处理操作中的插入。


如上所述,动画不会被抑制,但我猜它们会被“合并”。

至于例外,您必须确保保留数据模型(dataSource 返回的内容)和集合视图之间的对应关系:

  • 在调用deleteItemsAtIndexPaths:之前,请确保您已经从数据模型中删除了这些项目。

  • 确保在更改布局时不要更改数据模型。

时间可能很棘手,所以你应该再次尝试performBatchUpdates

【讨论】:

  • 错误状态本身表明其更改太多。分组根本没有帮助
  • 您是否尝试过更改更改的顺序(更改布局/删除单元格)?
  • 那会破坏我想要达到的效果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多