UICollectionView 在 performBatchUpdates 上崩溃
Posted
技术标签:
【中文标题】UICollectionView 在 performBatchUpdates 上崩溃【英文标题】:UICollectionView crash on performBatchUpdates 【发布时间】:2017-06-01 15:04:09 【问题描述】:我无法弄清楚这次崩溃的原因是什么?
Incident Identifier: BF4459C1-B97D-448E-AAE0-4DA6A1E4731C
CrashReporter Key: E725A626-A25C-4923-8383-0BC7ECA7DADE
Hardware Model: iPhone6,1
Process: SampleProject [480]
Path: /var/containers/Bundle/Application/458F9694-4BDA-4207-8C90-C2192520F8E2/SampleProject.app/SampleProject
Identifier: com.mydomain.SampleProject
Version: 1.3.0 (1.3.0.36)
Code Type: ARM-64
Parent Process: ??? [1]
Date/Time: 2017-05-17T04:11:03Z
Launch Time: 2017-05-17T04:06:51Z
OS Version: iPhone OS 10.3.1 (14E304)
Report Version: 104
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0xfffffffffffffff8
Crashed Thread: 0
Application Specific Information:
Selector name found in current argument registers: _setLayoutAttributes:atGlobalItemIndex:
Thread 0 Crashed:
0 UIKit 0x000000018de7d38c -[UICollectionViewData _setLayoutAttributes:atGlobalItemIndex:] + 80
1 UIKit 0x000000018de7ac94 __45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 1892
2 UIKit 0x000000018de79f68 -[UICollectionViewData validateLayoutInRect:] + 1492
3 UIKit 0x000000018de8023c -[UICollectionViewData layoutAttributesForElementsInRect:] + 264
4 UIKit 0x000000018de7dbc0 -[UICollectionView _updateVisibleCellsNow:] + 548
5 UIKit 0x000000018dfea058 -[UICollectionView _setupCellAnimations] + 28
6 UIKit 0x000000018dff459c -[UICollectionView _beginUpdates] + 44
7 UIKit 0x000000018e72c8c0 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:animator:] + 256
8 UIKit 0x000000018e72c79c -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:] + 92
9 UIKit 0x000000018e72c720 -[UICollectionView _performBatchUpdates:completion:invalidationContext:] + 80
10 UIKit 0x000000018dff4558 -[UICollectionView performBatchUpdates:completion:] + 60
11 SampleProject 0x000000010002a4b8 -[InvitesDataSource didDeleteDataAtIndexes:loadDataAtIndexes:] (InvitesDataSource.m:50)
12 SampleProject 0x0000000100092f58 -[DialogsController _didReceiveOldestInvites:] (DialogsController.m:311)
13 SampleProject 0x0000000100092500 -[DialogsController _didReceiveOldestDialogs:ofType:] (DialogsController.m:248)
14 SampleProject 0x000000010004aad8 -[DialogsController(Notifications) dialogListDidReceived:] (DialogsController+Notifications.m:94)
crashlog 中提到的那段代码相当平和:
- (void)didDeleteDataAtIndexes:(NSIndexSet *)deleted loadDataAtIndexes:(NSIndexSet *)loaded
[self.collectionView performBatchUpdates:^
[deleted enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)
[self.collectionView deleteItemsAtIndexPaths:[self _indexPathsForIndex:idx]];
];
[loaded enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)
[self.collectionView insertItemsAtIndexPaths:[self _indexPathsForIndex:idx]];
];
completion:^(BOOL finished)
[self.collectionView reloadData];
];
【问题讨论】:
你检查了吗? ***.com/questions/12656648/… 谢谢,我会仔细检查 【参考方案1】:这可能会发生,因为您还需要确保使用 collectionViews 删除和插入部分。当您尝试在不存在的部分中插入项目时,您将遇到此崩溃。
当您在 X+1、X 处插入项目时,Preform Batch 更新不知道您打算添加第 X+1 节。而您还没有添加该节。
确保使用插入和删除部分: https://developer.apple.com/documentation/uikit/uicollectionview/1618090-insertsections https://developer.apple.com/documentation/uikit/uicollectionview/1618102-deletesections
【讨论】:
【参考方案2】:要插入、删除或移动单个部分或项目,您必须按照以下步骤操作:
更新数据源对象中的数据。 调用集合视图的适当方法来插入或删除部分或项目。
在通知集合视图任何更改之前更新数据源至关重要。集合视图方法假定您的数据源包含当前正确的数据。如果没有,collection view 可能会从您的数据源接收到错误的项目集,或者请求不存在的项目并导致您的应用崩溃。
【讨论】:
根据崩溃报告确定这是问题所在? 您可以检查您的调试模式。首先需要更新数据源然后调用更新,否则在更新视图之前它发现集合数据没有变化。假设您尝试在更新中添加一行,因此它将尝试查找在数据源中添加的任何数据,否则它将向 CV 添加单元格。所以首先在数据源中进行更改添加/删除然后更新。谢谢以上是关于UICollectionView 在 performBatchUpdates 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
SupportFragment + TabWidget + Samsung Device = "java.lang.IllegalStateException: Can not perfor
IDEA启动报错,项目无法访问:The APR based Apache Tomcat Native library which allows optimal perfor
如何在 uicollectionview 标题中添加 uicollectionview
无法在 uicollectionview、UICollectionView 的特定 indexPath.row 处为单元格设置标题