2014-04-04 6 views
23

Ho una funzione che aggiorna UICollectionView esistente. UICollectionView è stato creato, posso vederlo, ma quando voglio accedere alle sue celle per aggiornarlo, sono nulle.UICollectionView cellForItemAtIndexPath è nil

-(void)finishExam{ 

    for (int i = 0; i < [self.questionsOverviewCollection numberOfItemsInSection:0]; i++) { 

     NSLog(@"self.questionsOverviewCollection - %@",self.questionsOverviewCollection); 
     NSLog(@"cell - %@",[self.questionsOverviewCollection cellForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]); 
     NSLog(@"overviewCell - %@",(OverviewCell*)[self.questionsOverviewCollection cellForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]); 
     NSLog(@"numOfCells - %d", [self.questionsOverviewCollection numberOfItemsInSection:0]); 

     OverviewCell *cell = (OverviewCell*)[self.questionsOverviewCollection cellForItemAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
      [cell finishExam]; 
    } 
} 


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    OverviewCell *cell = (OverviewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 

    [cell someSetUp]; 

    return cell; 
} 

Log:

self.questionsOverviewCollection - <UICollectionView: 0xa1abc00; frame = (14 219; 217 441); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0xe0617a0>; layer = <CALayer: 0xe0bbb00>; contentOffset: {0, 0}> collection view layout: <UICollectionViewFlowLayout: 0xe0cc3f0> 
cell - (null) 
overviewCell - (null) 
numOfCells - 30 
+0

hai trovato tutto cella nulla o si ottiene qualche cellula e dopo che u ottenere nulla? – CRDave

risposta

42

Dalle UICollectionView docs (enfasi mia)

Return Value
L'oggetto delle cellule nel percorso corrispondente indice o nullo se il la cella non è visibile o indexPath non è compreso nell'intervallo.

È necessario aggiornare il modello sottostante, che fornisce i dati alle viste.

+9

Questo ha funzionato per me, ma oltre a ricaricare i dati con [view reloadData], ho dovuto anche [visualizzare layoutIfNeeded] come per http://stackoverflow.com/a/21480786/1388195 – zyzof

+19

Chiamare [collectionView layoutIfNeeded] ha funzionato per io per acquisire la cella dopo aver chiamato [collectionView reloadData]. Grazie @zyzof –

+3

Grazie a tutti per il layoutIfNeeded !!! : D Mi stavo solo chiedendo, ma qualcuno sa perché? Perché nel mio caso la cella è stata visibile per tutto il tempo. – Happiehappie

6

Prova questo:

[collectionView reloadData]; 
[collectionView layoutIfNeeded];