UICollectionView recieved layout attributes for a

2019-02-19 01:36发布

I have used UICollection view to show items in grid layout.

For data source I have use 5*5 dimensional array.

And also I am returning 5 for numberOfItems in section and 5 for numberOfSections.

Then also my app is getting crashed with following error:

'UICollectionView recieved layout attributes for a cell with an index path that does not exist: {length = 2, path = 0 - 5}'

//////===viewcontroller.m==///////
- (void)viewDidLoad {
    self.theData = @[@[@"1",@"2",@"3",@"4",@"5"], @[@"6",@"7",@"8",@"9",@"10"],@[@"11",@"12",@"13",@"14",@"15"],@[@"16",@"17",@"18",@"19",@"20"],@[@"21",@"22",@"23",@"24",@"25"]];
    MultpleLineLayout *layout = [[MultpleLineLayout alloc] init];
    self.collectionView.collectionViewLayout = layout;
    self.collectionView.showsHorizontalScrollIndicator = NO;
    self.collectionView.showsVerticalScrollIndicator = NO;
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    self.view.backgroundColor = [UIColor blackColor];
    [self.collectionView registerClass:[DataCell class] forCellWithReuseIdentifier:@"DataCell"];
    [self.collectionView reloadData];
}


- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
{
    return 5;

}

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
    return 5;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView  cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    DataCell *cell = [collectionView  dequeueReusableCellWithReuseIdentifier:@"DataCell" forIndexPath:indexPath];
    cell.label.text = self.theData[indexPath.section ][indexPath.row];
    return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
   // UICollectionViewCell *item = [collectionView cellForItemAtIndexPath:indexPath];
    NSLog(@"%@",indexPath);

}
///////////////////////

Can anyone solve this problem? Thanks in advance.

2条回答
贼婆χ
2楼-- · 2019-02-19 01:53

Just in case others find this question with Google - I received the same error with a very interesting index path:

'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist: {length = 2, path = 0 - 0}'

I had simply forgotten to connect the collection view's data source and delegate to the view controller in Interface Builder. D'oh!

查看更多
不美不萌又怎样
3楼-- · 2019-02-19 02:03

The MultipleLineLayout was originally written for infinite scrolling, so there was a problem with that implementation for your use. It should look like this,

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {

    NSMutableArray* attributes = [NSMutableArray array];
    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]];
        }
    }
    return attributes;
}
查看更多
登录 后发表回答