UICollectionView PerformBatchUpdates:如果视图需要布局,则意外断言?

2024-07-04

如果我打电话-[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(使用前将#替换为@)

UICollectionView PerformBatchUpdates:如果视图需要布局,则意外断言? 的相关文章

随机推荐