NSInternalInconsistencyException - “请求类型MSCollectionElementKindCurrentTimeHorizo​​ntalGridline的装饰视图的布局属性

时间:2014-08-29 12:45:35

标签: ios objective-c uicollectionview uicollectionviewlayout

我正在处理的应用程序是以日历的形式显示CollectionView。 为简化起见,我们使用了github中的MSCollectionViewCalendarLayout。 现在它带有多个额外的装饰视图,如红线,表示日历中的当前时间。

在我们的实现中,还可以过滤不同类型,因此日历并不总是显示相同类型/数量的单元格。不幸的是,有时应用程序突然崩溃,它应该显示红色时间轴:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for layout attributes for decoration view of kind MSCollectionElementKindCurrentTimeHorizontalGridline in section 0 when there are only 0 sections in the collection view'
*** First throw call stack:
(
    0   CoreFoundation                      0x034761e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x02fcb8e5 objc_exception_throw + 44
    2   CoreFoundation                      0x03476048 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x00e2f4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x018eb290 -[UICollectionViewData layoutAttributesForDecorationViewOfKind:atIndexPath:] + 228
    5   UIKit                               0x018b5764 -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] + 242
    6   UIKit                               0x018a8036 -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes:] + 381
    7   UIKit                               0x018a9775 -[UICollectionView _updateVisibleCellsNow:] + 4730
    8   UIKit                               0x018ad65f -[UICollectionView layoutSubviews] + 265
    9   UIKit                               0x012d0964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    10  libobjc.A.dylib                     0x02fdd82b -[NSObject performSelector:withObject:] + 70
    11  QuartzCore                          0x026a445a -[CALayer layoutSublayers] + 148
    12  QuartzCore                          0x02698244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    13  QuartzCore                          0x026980b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
    14  QuartzCore                          0x025fe7fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
    15  QuartzCore                          0x025ffb85 _ZN2CA11Transaction6commitEv + 393
    16  QuartzCore                          0x02600258 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
    17  CoreFoundation                      0x0343e36e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    18  CoreFoundation                      0x0343e2bf __CFRunLoopDoObservers + 399
    19  CoreFoundation                      0x0341c254 __CFRunLoopRun + 1076
    20  CoreFoundation                      0x0341b9d3 CFRunLoopRunSpecific + 467
    21  CoreFoundation                      0x0341b7eb CFRunLoopRunInMode + 123
    22  GraphicsServices                    0x049615ee GSEventRunModal + 192
    23  GraphicsServices                    0x0496142b GSEventRun + 104
    24  UIKit                               0x01261f9b UIApplicationMain + 1225
    25  CariAudit                           0x001036ad main + 141
    26  libdyld.dylib                       0x039d9701 start + 1
    27  ???                                 0x00000003 0x0 + 3
)
libc++abi.dylib: terminating with uncaught exception of type NSException

现在我知道,使用这种自定义布局,许多人在更改collectionView的基础数据时会收到此错误消息,解决方法是在布局上调用“ invalidateLayoutCache ”。唯一的问题是我已经在我的代码中使用了它,然后在collectionView上调用 reloadData 之前调用它。

有没有人可能有解决这类问题的想法/方法? 感谢

1 个答案:

答案 0 :(得分:3)

经过几个小时的搜索,我终于找到了错误。 问题是MSCollectionViewCalendarLayout错过了清空Attributes-Dictionaries currentTimeIndicatorAttributes currentTimeHorizo​​ntalGridlineAttributes

要修复错误,我所要做的就是使用以下内容扩展 invalidateLayoutCache 方法:

[self.currentTimeIndicatorAttributes removeAllObjects];
[self.currentTimeHorizontalGridlineAttributes removeAllObjects];