By Paulius Dragunas

2013-11-30 05:30:57 8 Comments

I am attempting to update a single cell inside a UICollectionView, specifically I am just trying to update an image in that specific cell detonated by cell.imageView. [self.collectionView reloadData] is not really an option because it makes the whole collection view flash. [self.collectionView beginUpdates] is not a thing in a UICollectionViewit seems.

I understand I may be able to use:

[self.collectionView performBatchUpdates:^{
    //do something
} completion:nil];

I am not exactly sure what to put inside a completion block to update that certain cell's imageView. This is all being done inside of didSelectItemAtIndexPath.Also I am not using NSFetchedResultsController. Any ideas?


@gavdotnet 2013-12-01 22:34:53

Dinesh's answer is spot-on. But to avoid unwanted animations when reloading (aka "flashing") use:

BOOL animationsEnabled = [UIView areAnimationsEnabled];
[UIView setAnimationsEnabled:NO];
[myCollectionView reloadItemsAtIndexPaths:myIndexPaths];
[UIView setAnimationsEnabled:animationsEnabled];

@Paulius Dragunas 2013-12-02 02:35:13

I doesn't seem that I can assign a UIVIew to a BOOL.

@gavdotnet 2013-12-02 06:10:54

@user1933131 Answer updated with correct method name.

@Unome 2015-04-14 22:48:27

To what view do you set this code? @gavdotnet

@gavdotnet 2015-04-15 00:11:33

@Unome It's a class method so no specific view.

@Dinesh Raja 2013-11-30 05:48:41

- (void)reloadItemsAtIndexPaths:(NSArray *)indexPaths

Here it is a method to reload the specific indexPaths in your collectionView

@Paulius Dragunas 2013-11-30 21:52:15

Thank you! that ended up working. Now let's say I have a collectionView of 50 cells, and i just in data for another 50 cells, how to i add those 50 extra cells and display the data in them without doing a reloadData? Doing a reloadData results in an unnecessary flash of all the images in the collectionView and I would like to avoid that

@Dinesh Raja 2013-12-02 07:41:03

you have to call reloadData, if your array changes by any mean. because collection view don't have any idea, if you didn't call reloadData method. May be invalidateLayout method in collectionViewLayout works. But you don't have any other option.

@Dillan 2015-06-19 23:47:18

It can be a little tricky to implement correctly, but you could always use -[UICollectionView insertItemsAtIndexPaths:] to insert the cells in the collection view after you updated the data source.

@Vizllx 2013-11-30 05:47:17

See Inserting, Deleting, and Moving Sections and Items from the "Collection View Programming Guide for iOS":

To insert, delete, or move a single section or item, you must follow these steps:

Update the data in your data source object. Call the appropriate method of the collection view to insert or delete the section or item. It is critical that you update your data source before notifying the collection view of any changes. The collection view methods assume that your data source contains the currently correct data. If it does not, the collection view might receive the wrong set of items from your data source or ask for items that are not there and crash your app.

So in your case, you must add an image to the collection view data source first and then call insertItemsAtIndexPaths. The collection view will then ask the data source delegate function to provide the view for the inserted item.

Related Questions

Sponsored Content

25 Answered Questions

13 Answered Questions

23 Answered Questions

[SOLVED] Cell spacing in UICollectionView

18 Answered Questions

1 Answered Questions

[SOLVED] Cells overlapping in UICollectionView

8 Answered Questions

[SOLVED] Assertion Failure in UICollectionViewData indexPathForItemAtGlobalIndex

Sponsored Content