UICollectionView got layout attributes for cell in ios 7

I use custom UICollectionViewin my application. However, I have a problem that could cause my application to crash. Accident Log:
Note. This error does not occur on iOS 8

2015-05-29 11:49:26.316 app9to5[1834:607] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x7fca0e00> {length = 2, path
= 0 - 14}'

> First throw call stack: (  
       CoreFoundation                      0x039b61e4 __exceptionPreprocess + 180  
       libobjc.A.dylib                     0x036808e5 objc_exception_throw + 44  
       CoreFoundation                      0x039b6048 +[NSException raise:format:arguments:] + 136  
       Foundation                          0x016954de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116  
       UIKit                               0x02be0866 __45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 1793  
       UIKit                               0x02bdfaed -[UICollectionViewData validateLayoutInRect:] + 1376  
       UIKit                               0x02ba5603 -[UICollectionView layoutSubviews] + 173  
       UIKit                               0x025c8964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355  
       libobjc.A.dylib

Please help me decide. Thank you very much!

+4
source share
3 answers

You should try the following:

In -(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect you put this:

for(NSInteger i=0 ; i < self.collectionView.numberOfSections; i++) {
    for (NSInteger j=0 ; j < [self.collectionView numberOfItemsInSection:i]; j++) {
        NSIndexPath* indexPath = [NSIndexPath indexPathForItem:j inSection:i];
        [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
    }
}

Hope this helps.

+3
source

Try disabling the layout before calling reloadData in the collection view.

[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView reloadData];
+3
source

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    self.collectionView.collectionViewLayout.invalidateLayout()
}
+1

All Articles