我的应用程序每隔一段时间就通过Crashlytics报告此断言失败:
Fatal Exception: NSInternalInconsistencyException
UICollectionView dataSource is not set
0 CoreFoundation __exceptionPreprocess + 126
3 Foundation -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 92
4 UIKit -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes:] + 148
5 UIKit -[UICollectionView _updateVisibleCellsNow:] + 3398
6 UIKit -[UICollectionView layoutSubviews] + 240
7 UIKit -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 514
8 QuartzCore -[CALayer layoutSublayers] + 136
9 QuartzCore CA::Layer::layout_if_needed(CA::Transaction*) + 360
10 QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
11 QuartzCore CA::Context::commit_transaction(CA::Transaction*) + 222
12 QuartzCore CA::Transaction::commit() + 324
13 UIKit _afterCACommitHandler + 132
14 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
20 UIKit UIApplicationMain + 1440
21 NRDB main.m line 14 main
22 libdyld.dylib start + 2
在应用程序使用UICollectionViews的所有三个地方,我确保a)在XIB和控制器的viewDidLoad
方法中都设置了dataSource,并且b)它在重置为nil控制器的dealloc
。
使用
将补充视图(标题视图)添加到集合视图中[self.collectionView registerNib:[UINib nibWithNibName:@"HeaderXib" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"sectionHeader"];
对于标题视图,我使用CSStickyHeaderFlowLayout。
到目前为止,我无法在本地重现这一点。关于可能出现什么问题的任何想法,甚至是如何弄清楚这三个观点中涉及哪一个?
答案 0 :(得分:3)
尽量减少猜测:
将您的集合视图子类化为子类,无论您在何处使用它们,都限定在该位置:
@interface MyDetailViewController_CollectionView : UICollectionView
@end
@implentation MyDetailViewController_CollectionView
-(void)layoutSubviews{
//When the stacktrace is generated, it will now include -[MyDetailViewController_CollectionView layoutSubviews]
[super layoutSubviews];
}
@end
然后将这些控制器设置为具有相应集合视图的实例。这可以通过设置自定义类在界面构建器中完成。
如果实现此操作,请手动触发异常以确保堆栈跟踪看起来像您希望的那样。你应该能够在-collectionView:cellForItemAtIndexPath:
中做到这一点UICollectionView.dataSource很弱
似乎可能的情况是控制器被销毁,但集合视图以某种方式存活。
取消分配控制器时,请确保对集合视图和任何包含视图的所有强引用都设置为nil。
UIViews可以在视图层次结构中生存
在dealloc上添加一个断言NSAssert(self.collectionView.window == nil)。如果窗口不是nil,则集合视图是视图层次结构的一部分,即使控制器已被销毁,也可以接收布局事件。
这可能是由
引起的手动将视图控制器视图添加/删除到视图层次结构
在解雇动画完成之前取消分配视图控制器