Invalid cells returned when deleted in custom UICollectionView

I am creating a UICollectionView with a custom layout.

3x4 horizontal scroll layout. I got a cell layout and page scrolling works fine.

My expected result looks something like this:

enter image description here

(available at http://www.tinyuploads.com/images/0EVQnT.png )

However, when scrolling, it seems that the wrong cells are being laid off, and instead, my actual result is this:

enter image description here

(available at http://www.tinyuploads.com/images/8lvJId.png )

Also, when I go back to the first page, “A” is no longer in the first position.

My data source and delegate methods are as follows:

#pragma mark - UIViewController Life Cycle - (void)viewDidLoad { [super viewDidLoad]; self.collectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f]; self.alphabet = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"X", @"Y", @"Z", nil]; self.colors = [NSMutableArray arrayWithObjects:[UIColor colorWithRed:(135/255.0) green:(175/255.0) blue:(88/255.0) alpha:1], [UIColor colorWithRed:(65/255.0) green:(124/255.0) blue:(185/255.0) alpha:1], [UIColor colorWithRed:(201/255.0) green:(189/255.0) blue:(64/255.0) alpha:1], nil]; [self.collectionView reloadData]; } #pragma mark - UICollectionView datasource - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return self.alphabet.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ NSString *title = [self.alphabet objectAtIndex:indexPath.row]; UIColor *backgroundColor = [self.colors objectAtIndex:indexPath.row % 3]; CategoryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CategoryCellIdentifier forIndexPath:indexPath]; cell.title.text = title; cell.backgroundColor = backgroundColor; [cell setNeedsLayout]; return cell; } #pragma mark - UICollectionViewDelegate - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"You touched: %d", indexPath.row); } 

I doubt how I should think about sections. As you can see here, I have only one section containing all my items (contents of the alphabet).

Any help is appreciated.

+4
source share
1 answer

Unlike what I can say, it looks like a subclass might not be implemented correctly. Below is an example of using the built-in horizontal flow, which you can use to change the code.

Note. This example assumes that you have set the correct size in the storyboard, and you will have 3 columns by 4 rows.

 @interface ViewController () @property (nonatomic, strong) NSMutableArray* alphabet; @property (nonatomic, strong) NSMutableArray* colors; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.collectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f]; self.alphabet = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil]; self.colors = [NSMutableArray arrayWithObjects:[UIColor colorWithRed:(135/255.0) green:(175/255.0) blue:(88/255.0) alpha:1], [UIColor colorWithRed:(65/255.0) green:(124/255.0) blue:(185/255.0) alpha:1], [UIColor colorWithRed:(201/255.0) green:(189/255.0) blue:(64/255.0) alpha:1], nil]; [self.collectionView reloadData]; } #pragma mark - UICollectionView datasource - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ // Full pages NSInteger count = self.alphabet.count /12 + (self.alphabet.count % 12 > 0 ? 1 : 0); count *= 12; return count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ NSInteger row = indexPath.row % 4; NSInteger col = indexPath.row / 4; NSInteger page = col /3 * 12; col = col % 3; NSInteger ii = row*3+col + page; NSString *title = ii >= self.alphabet.count ? nil : [self.alphabet objectAtIndex:ii]; UIColor *backgroundColor = [self.colors objectAtIndex:col]; UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; UILabel* label = (UILabel*)[cell viewWithTag:1]; // label added in storyboard label.text = title; cell.backgroundColor = backgroundColor; [cell setNeedsLayout]; cell.hidden = title == nil; return cell; } #pragma mark - UICollectionViewDelegate - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"You touched: %d", indexPath.row); } @end 
0
source

All Articles