2013-06-24 4 views
0

Mon installation: Un UICollectionView standard avec une disposition de flux; datasource est défini sur mon contrôleur. La disposition est configurée comme d'habitude dans le fichier xib. Lorsque je tente d'accéder à une mise en page de cellule attributs via layoutAttributesForItemAtIndexPath: dans la méthode viewDidLoad du contrôleur comme ceci:layoutAttributesForItemAtIndexPath de UICollectionViewFlowLayout renvoie zéro lorsqu'il est appelé "trop ​​tôt"

NSLog(@"LayoutAttribute: %@", [self.collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]); 

La sortie est

"LayoutAttribute: (null)" 

même si la mise en page a toutes les informations nécessaires pour me donner la attributs de mise en page corrects. Il ne fonctionne toujours pas viewWillAppear :, mais « comme par magie » commence à travailler dans viewDidAppear:

"LayoutAttribute: <UICollectionViewLayoutAttributes: 0x8c4f710> index path: (<NSIndexPath 0x8c48be0> 2 indexes [0, 0]); frame = (0 0; 50 50);" 

J'ai découvert une façon très étrange de le faire fonctionner; Je seulement l'accès à l'collectionViewContentSize avant de demander la mise en page des attributs:

NSLog(@"Layout content size: %@", NSStringFromCGSize(self.collectionView.collectionViewLayout.collectionViewContentSize));  
NSLog(@"LayoutAttribute: %@", [self.collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]); 

La sortie est, comme prévu tout le long:

"Layout content size: {768, 50}" 
"LayoutAttribute: <UICollectionViewLayoutAttributes: 0x8c4f710> index path: (<NSIndexPath 0x8c48be0> 2 indexes [0, 0]); frame = (0 0; 50 50);" 

Ce qui se passe ici? Je suppose que l'accès à la taille du contenu déclenche quelque chose dans la mise en page, mais est-ce que quelqu'un sait s'il existe un moyen approprié de le faire? Ou est-ce juste un bug ennuyeux?

Répondre

0

La documentation de layoutAttributesForItemAtIndexPath: indique qu'il renvoie uniquement nil s'il n'y a aucun élément sur ce chemin d'index. N'avez-vous pas appelé reloadData sur votre collection avant d'appeler le layoutAttributesForItemAtIndexPath:?

Un autre problème courant est qu'un objet intermédiaire de votre chaîne d'appel est nil. Peut-être collectionView ou collectionView.collectionViewLayout est nil?