cellForItemAtIndexPath not called but numberOfItemsInSection does

IosObjective CUicollectionview

Ios Problem Overview


This could be a duplicate post but I haven't found the solution.

I'm setting my UICollectionView as:

UINib *nib = [UINib nibWithNibName:@"CollectionViewCell"
                           bundle:[NSBundle mainBundle]];
[_collectionView registerNib: nib forCellWithReuseIdentifier:@"bCell"];

(I've tried to set a delegate, without delegate, etcetera).

But then, only the

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section gets called while

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath doesn't.

I've checked the numberOfItemsInSection I return, and it's always > 0 (it's exactly 17).

I've checked to call [_collectionView reloadData]; and nothing happens either.

I've tried different things but I can't make it work.

Furthermore, my UICollectionView should be here but it's not:

enter image description here

Does anyone have a clue? Thank you.

Ios Solutions


Solution 1 - Ios

Ok I think this could be useful for future problems with this...

It was because of constraints on the StoryBoard. I don't really understand why that happens, because I just had fixed an horizontal space. I removed the horizontal space as constraint for that View and everything works fine.

Well, let's life flow.

Solution 2 - Ios

I also face same issue and finally got to know that i have passed wrong class object for collectionViewLayout , i change to UICollectionViewFlowLayout instead of UICollectionViewLayout while creating object for UICollectionView like below its stared calling all delegate method.

 collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())

Solution 3 - Ios

I meet this problem too. I checked all the possible issues, everything looks ok. Then I tried to changed the reload methods.

[self.colView reloadData] -> [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]];

Then all things worked. However I still don't understand how.

Solution 4 - Ios

1. cellForItemAtIndexPath will be called when you return More than 0 Items on numberOfItemsInSection method.

2. Check that your UICollectionViewFlowLayout is correct or your own. UICollectionViewLayout is abstract class you can't use it directly

3. Check the size of the collection view cell & Collection view.

4. Try to set your collectionview size by in code. [yourCollectionViewFlowLayout setItemSize:CGSizeMake(200, 200)];

5.If any of them NOT works, then kill the XCode & restart . Sometimes it will fix the issue.

Apple says

The UICollectionViewLayout class is an abstract base class that you subclass and use to generate layout information for a collection view. The job of a layout object is to determine the placement of cells, supplementary views, and decoration views inside the collection view’s bounds and to report that information to the collection view when asked. The collection view then applies the provided layout information to the corresponding views so that they can be presented onscreen.

You must subclass UICollectionViewLayout in order to use it. Before you consider subclassing, though, you should look at the UICollectionViewFlowLayout class to see if it can be adapted to your layout needs.

Solution 5 - Ios

Add this to viewDidLoad:

self.automaticallyAdjustsScrollViewInsets = NO;

Solution 6 - Ios

I just found that NONE of cellForItemAtIndexPath gets called (in iOS 10) as long as at least ONE cell has a height of zero.

Disclaimer: sorry if this should have been a comment - not enough reputation.

Solution 7 - Ios

For me the cellForItemAtIndexPath not called for the first time after i set the constraint of the collectionView to 0 and then again setting it to its Actual Size.

 @IBOutlet weak var collectionVwHeightContraint: NSLayoutConstraint!
 if attachments.count > 0 {
        
     collectionVwHeightContraint.constant = 100
 }else {
        
     collectionVwHeightContraint.constant = 0
 }
 // collectionVwHeightContraint is my collectionView height Contraint outlet

I solved this by calling:

self.view.layoutIfNeeded()

Hope it will help someone :)

Solution 8 - Ios

Might help somebody else, it could be 2 things:

  1. Height of the cell is not calculated properly, so need to check the constraints of the cell.

To fix this, I implemented UICollectionViewLayout's method: extension TableViewCellActionItemPageControl: UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 414, height: 213) 
}

2. Other possibility is: the size of the collection view cell returned is more that the collection view itself. Make sure the height of your cell is smaller than the height of your collective.

Solution 9 - Ios

What helped me was to set the correct itemSize. My cellForItemAtIndexPath was not being called because of the wrong height.

So I set the size at:

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)];

Solution 10 - Ios

In my case, it was working alternatively. then I run reloadData() on the main thread and the issue fixed. But later after certain changes again the same issue arose. Finally, I made it like below. Now no issues, I feel self.view.layoutIfNeeded() plays a key role

DispatchQueue.main.async {
                self.view.layoutIfNeeded()
                self.collectionView.reloadData()
            }

Solution 11 - Ios

For me the issue was that I was creating my Collection View programmatically but I had given it CGRectZero as its frame. I was laying it out using Auto Layout after viewDidLoad. If I lay out the collection view while the view controller is loading, it ends up calling cellForItemAtIndexPath: correctly.

Solution 12 - Ios

For me it was that my collectionView's container didn't have translatesAutoresizingMaskIntoConstraints = false

Solution 13 - Ios

I had same problem with collection view outlet on a storyboard with "standard" constraints (bottom, top, leading, trailing fixed to inner view).

I solved in this way:

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.collectionView.frame.size

Solution 14 - Ios

I had faced a similar problem. The issue was with the numberOfItems in section. Your cellForRowAtIndexPath might not be called if either your number of sections or number of rows in section is below zero.

Solution 15 - Ios

In my case, I messed up with my custom cell label constraints. Verify your constraints once again.

Solution 16 - Ios

reza_khalafi answer worked for me, i am using Xcode 11 and swift 4.2. swift 4.2 version of reza's answer.

add this on viewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

Solution 17 - Ios

In my case, collectionViewCell's height was greater than CollectionView height.

Solution 18 - Ios

To complete @frank answer: (swifty answer)

extension UICollectionView {
   func reloadFirstSection() {
        let indexPath = IndexPath(item: 0, section: 0)
        reloadSections(IndexSet(integer: indexPath.section) )
    }
}

and then instead of collectionView.reloadData() call collectionView.reloadFirstSection()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRafael Ruiz MuñozView Question on Stackoverflow
Solution 1 - IosRafael Ruiz MuñozView Answer on Stackoverflow
Solution 2 - IosNarayanaView Answer on Stackoverflow
Solution 3 - IosfrankView Answer on Stackoverflow
Solution 4 - IosVijay-Apple-Dev.blogspot.comView Answer on Stackoverflow
Solution 5 - Iosreza_khalafiView Answer on Stackoverflow
Solution 6 - IosKiRvizView Answer on Stackoverflow
Solution 7 - IosAriven NadarView Answer on Stackoverflow
Solution 8 - IosWingJammerView Answer on Stackoverflow
Solution 9 - IosLuiz DiasView Answer on Stackoverflow
Solution 10 - Iosvilas deshmukhView Answer on Stackoverflow
Solution 11 - IosLiron YahdavView Answer on Stackoverflow
Solution 12 - IosJeremy KelleherView Answer on Stackoverflow
Solution 13 - IosLuca DavanzoView Answer on Stackoverflow
Solution 14 - IosiPhoneDeveloperView Answer on Stackoverflow
Solution 15 - IosMadhurya GandiView Answer on Stackoverflow
Solution 16 - IosFaris MuhammedView Answer on Stackoverflow
Solution 17 - IosNikiView Answer on Stackoverflow
Solution 18 - IosMehrdadView Answer on Stackoverflow