UICollectionView - didDeselectItemAtIndexPath not called if cell is selected

ios, objective-c, uicollectionview

Solution

The issue is, that the cell is selected, but the `UICollectionView` does not know anything about it. An extra call for the `UICollectionView` solves the problem:

[collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone]; 

Full code:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    cell.selected = YES;
    [collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
    return cell;
}

I keep the question to help someone who may face the same problem.

Problem

The first thing I do is to set the cell selected. ``` - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; cell.selected = YES; return cell; } ``` And the cell is successfully selected. If the user touches the selected cell, than should the cell be deselected and the delegates be called. But this never happen. ``` - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __PRETTY_FUNCTION__); } - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __PRETTY_FUNCTION__); } ``` I know that the delegates are not called if I set the selection programmatically. The delegate and datasource are set. However, this delegate gets called: ``` - (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __PRETTY_FUNCTION__); return YES; } ``` If I remove the `cell.selected = YES` than everything is working. Is there any one who can me explain this behaviour?

Original source