UICollectionView中的断言失败有补充视图/节头,dataSource是否为零?

时间:2015-03-29 10:56:49

标签: ios uicollectionview

我的应用程序每隔一段时间就通过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

到目前为止,我无法在本地重现这一点。关于可能出现什么问题的任何想法,甚至是如何弄清楚这三个观点中涉及哪一个?

1 个答案:

答案 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,则集合视图是视图层次结构的一部分,即使控制器已被销毁,也可以接收布局事件。

这可能是由

引起的
  • 手动将视图控制器视图添加/删除到视图层次结构

  • 在解雇动画完成之前取消分配视图控制器