如果我打电话-[UICollectionView performBatchUpdates:]
从内部viewWillAppear:
, 里面viewDidAppear:
,在这些方法之间,或者每当集合视图尚未由更大的 UIView 视图层次结构布局时,集合视图将断言:
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,
原因:'无效更新:节数无效。节数
更新后集合视图中包含的数量(X)必须等于
更新前集合视图中包含的节数 (X),加上或减去
插入或删除的节数(X 插入,0 删除)。
其中“X”是我插入的任意数量的项目。我已确认数据源正在正确更新,并且更新中的索引路径是正确的。
当数据源在调用之前立即更新时,集合视图状态如何与数据源保持一致performBatchUpdates:
?似乎有什么意外触发了 reloadData。
UICollectionView 似乎有特殊行为(一个错误?):如果它需要布局,那么performBatchUpdates:
有效地充当reloadData
在调用更新块之前,这会使您计划在更新块期间进行的任何更改对集合视图簿记有毒。
如果您计划在正确布局之前将批量更新应用于视图(例如,来自快速变化的数据模型环境中的通知处理程序),则需要确保viewWillAppear:
你所说的layoutIfNeeded
在集合视图上。这将阻止集合视图在调用中重新加载performBatchUpdates:
.
我们通过将日志放入集合视图数据源中发现了此行为numberOfSections
方法并打印出此回溯以查看它是从哪里调用的:
2014-11-12 15:30:06.173 CVCrasher[66830:6387719] [CV] #sections stack: (
0 CVCrasher 0x000000010ba9122d -[MyViewController numberOfSectionsInCollectionView:] + 61
1 UIKit 0x000000010cfc2811 -[UICollectionViewData _updateItemCounts] + 147
2 UIKit 0x000000010cfc4a89 -[UICollectionViewData numberOfSections] + 22
3 UIKit 0x000000010cfaebae -[UICollectionViewFlowLayout _getSizingInfos] + 348
4 UIKit 0x000000010cfafca9 -[UICollectionViewFlowLayout _fetchItemsInfoForRect:] + 526
5 UIKit 0x000000010cfab51f -[UICollectionViewFlowLayout prepareLayout] + 257
6 UIKit 0x000000010cfc2a10 -[UICollectionViewData _prepareToLoadData] + 67
7 UIKit 0x000000010cfc30e9 -[UICollectionViewData validateLayoutInRect:] + 54
8 UIKit 0x000000010cf8b7b8 -[UICollectionView layoutSubviews] + 170
9 UIKit 0x000000010c9d1973 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
10 QuartzCore 0x0000000110cf2de8 -[CALayer layoutSublayers] + 150
11 QuartzCore 0x0000000110ce7a0e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
12 UIKit 0x000000010c9c5847 -[UIView(Hierarchy) layoutBelowIfNeeded] + 611
13 UIKit 0x000000010cf9c7b7 -[UICollectionView performBatchUpdates:completion:] + 164
...
在这里你可以清楚地看到调用performBatchUpdates:
正在访问数据源并与更改后的模型保持一致before应用更新。当调用块本身时,集合视图将抛出一个断言,就像我在原始问题中所示的那样。
tl;dr- 当UICollectionView需要布局时,performBatchUpdates:
有效地起到了呼吁作用reloadData
并会因为记账不当而使批量更新块断言。称呼layoutIfNeeded
in viewWillAppear:
以避免这种行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)