Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS UICollectionView insertItemsAtIndexPaths crash when header is on screen

I have an UICollectionView with a header of size non-zero. It seems whenever insertItemsAtIndexPaths is called, if the header is on screen, the program crashes with the following message:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <_UICollectionViewItemKey: 0xa38c910> Type = SV Kind = UICollectionElementKindSectionHeader IndexPath = <NSIndexPath 0xa38c7c0> 2 indexes [0, 0])'

When the header size is zero, or when the header is not on screen, calling insertItemsAtIndexPaths works fine. Does anyone know how to fix this? Thanks!

The class is a sub class of UICollectionViewController. Here is the code related to UICollectionView:

- (id)init {
  // Collection view layout
  UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
  layout.itemSize = CGSizeMake(100, 100);
  layout.headerReferenceSize = CGSizeMake(320, 50); // Left for the switch
  layout.minimumInteritemSpacing = 5;
  layout.minimumLineSpacing = 5;
  layout.scrollDirection = UICollectionViewScrollDirectionVertical;
  layout.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5);

  if (self = [super initWithCollectionViewLayout:layout]) {
    // Collection view setup
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"ID"];
    self.collectionView.frame = CGRectMake(0, -20, 320, 480-20-44-49);
    self.collectionView.backgroundView = nil;
    self.collectionView.backgroundColor = [UIColor clearColor];
    ...
  }
  return self;
}

Then I implemented two delegate methods:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
  return [blogs count];
}

and

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionViewArg cellForItemAtIndexPath:(NSIndexPath *)indexPath {
  UICollectionViewCell *cell = [collectionViewArg dequeueReusableCellWithReuseIdentifier:@"ID" forIndexPath:indexPath];
  /* Some code to get blogView */
  [cell.contentView addSubview:blogView];
  return cell;
}
like image 996
zhengwx Avatar asked Feb 18 '23 11:02

zhengwx


1 Answers

The problem is there said in log that the header cannot be nil.So give some valid input there and you can avoid the crash.

Like if the header section needs no input give it an view with clearclolor

For implementhing the header section you must implement the following datasource method

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath;
like image 132
Lithu T.V Avatar answered Apr 28 '23 19:04

Lithu T.V