Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView - didDeselectItemAtIndexPath not called if cell is selected

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?

like image 995
zeiteisen Avatar asked Dec 04 '13 16:12

zeiteisen


2 Answers

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.

like image 94
zeiteisen Avatar answered Sep 28 '22 07:09

zeiteisen


I think the solution @zeiteisen provided is a way around solution. The actual thing lies in the selection mode. There is nothing to be set the in property cell.selected.

There are two properties of the UICollectionView name allowsMultipleSelection and allowsSelection.

allowsMultipleSelection is NO by default and allowsSelection is YES.

If you want to select only one cell then the code @the initialization look like

yourCollectionView.allowsMultipleSelection = NO; yourCollectionView.allowsSelection = YES; //this is set by default 

Then the settings will allow you select only one cell at a time, not less not more. You must have to select at least one cell. The didDeselectItemAtIndexPath wont be called unless you select another cell. Tapping an already selected UICollectionViewCell won't make it to Deselect. This is the policy behind the implementation.

If you want to select multiple cell then the code @the initialization should look like the following:

yourCollectionView.allowsMultipleSelection = YES; yourCollectionView.allowsSelection = YES; //this is set by default 

Then the settings will allow to select multiple cell. This settings allow none or multiple UICollectionViewCell to be selected. Number of cell selected will be

0 <= number_selected_cell <= total_number_of_cell 

This is the policy behind the multiple cell selection.

If you are intended to use any of the above you are welcome to use apples api without extra headache, otherwise you got to find a way around to sneak into your goal using your own code or apple's api.

like image 43
Ratul Sharker Avatar answered Sep 28 '22 07:09

Ratul Sharker