So I have a main object that has many images associated with it. An Image is also an object.
Say you have a collection view controller, and in that controller you have
cellForItemAtIndexPath
well based on the main object, if it has the current image associated with it I want to set selected to true. But I want the user to be able to "un-select" that current cell at any time to remove its association with the main object.
I find that if you set "selected to true" - if there is an relation between the main object and image in cellForItemAtIndexPath
, de-selection is no longer an option.
in
didDeselectItemAtIndexPath
and
didSelectItemAtIndexPath
I test with a log to see if they are called. If a cell is set to selected - nether gets called, but If I never set a cell to selected in cellForItemAtIndexPath
I can select and deselect all I want.
Is this the intended way a collection view is supposed to work? I read the docs and it does not seem to talk about this being so. I interpret the docs to mean it works the way a table view cell would. with a few obvious changes
This also shows the controller is set up correct and is using the appropriate delegate methods.... hmmmm
I don't know that I understand the problem, but selected status is set per cell and would include all subviews within the cell. You don't explain what you mean by "a main object has many images associated with it." Associated as in subviews? Or what kind of association exactly do you mean?
It sounds like a design problem to me. Perhaps you need a UIView subclass that contains whatever associated objects you need to have; that subclass can then be set as the content view. I do this, for example, where I have an image, a description, and a sound recording related to the image. All are defined in the subclass and then each of these subclasses becomes a content view for a single cell.
I've also used an arrangement to related images to a folder which contains them. Under this set up, folders and images each have a subclass and either one might be attached to a cell as a content view (these are stored in core data as a single entity).
Perhaps you can further explain your problem?
Have you looked at:
Please state your problem more clearly and perhaps we can get to the bottom of it. I've just spent some time with UICollectionView.
I think your problem may be stemming from the confusion that if you set
cell.selected = YES
programmatically, the reasondidSelectItemAtIndexPath:
is not getting called is because that is only used when the collectionView itself is responsible for the cell's selection (eg. via a tap).I'm using a custom cell subclass, for me I just had to set
self.selected = false
inprepareForReuse()
in the subclass.When calling both
[UICollectionViewCell setSelected:]
and[UICollectionView selectItemAtIndexPath:animated:scrollPosition:]
in[UICollectionView collectionView:cellForItemAtIndexPath:]
doesn't work try calling them inside adispatch_async(dispatch_get_main_queue(), ^{});
block.That's what finally fixed it for me.
I don't know why
UICollectionView
is so messy like this compared toUITableViewController
... A few things I found out.The reason why
setSelected:
gets called multiple times is because of the sequence methods get called. The sequence is very similar to that ofUITextFieldDelegate
methods.The method
collectionView:shouldSelectItemAtIndexPath:
is called before thecollectionView
actually selects the cell because it's actually asking "should it be selected"?collectionView:didSelectItemAtIndexPath:
is in fact called after thecollectionView
selects the cell. Hence the name "did select."So this is what is happening in your case (and my case, and I had to wrestle hours over this).
A selected cell is touched again by the user to deselect.
shouldSelectItemAtIndexPath:
is called to check whether the cell should be selected. ThecollectionView
selects the cell and thendidSelectItemAtIndexPath
is called. Whatever you do at this point is after the the cell'sselected
property is set toYES
. That's why something likecell.selected = !cell.selected
won't work.TL;DR - Have your
collectionView
deselect the cell in the delegate methodcollectionView:shouldSelectItemAtIndexPath:
by callingdeselectItemAtIndexPath:animated:
and returnNO
.Short example of what I did:
I had a Deselect issue with
UICollectionView
and I found that I was not allowing multiple selection on collectionView. So when I was testing I tried always on the same cell and if single selection is ON you can't Deselect a cell already selected.I had to add: