2013-01-29 3 views
4

J'ai un UICollectionView qui utilise une classe UICollectionViewCell personnalisée. L'idée de base est que la vue de collection traverse les répertoires et affiche les photos contenues dans le répertoire (résultats via des appels d'API). Le contrôleur de vue initial affiche un UICollectionView et les taps sur les cellules génère une nouvelle vue avec un nouveau UICollectionView. Le contenu du répertoire est stocké dans un NSMutableDictionary avec l'ID du répertoire étant la clé. Le problème se produit lorsqu'une nouvelle vue/collectionview est créée avec une liste plutôt courte de photos - habituellement moins de 30. Quand je fais pivoter l'appareil, la vue de collection essaye de rendre de nouveau, et l'application se bloque avec un "index X au-delà des limites [0 .. Y]", avec X étant un nombre plus grand que Y (le dernier élément du tableau).cellForItemAtIndexPath étant appelé au-delà des limites

J'ai remarqué que cela a tendance à se produire uniquement lorsque la vue de collection nouvellement affichée contient moins d'éléments que la vue de collection "root".

Voici des exemples de pertinents (certaines d'entre elles, en tout cas) Code:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section { 
    return [[photos objectForKey:api.directoryID] count]; 
} 

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    PhotoCell *photoCell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    photoCell.photo = [[photos objectForKey:api.directoryID] objectAtIndex:indexPath.row]; 
    return photoCell; 
} 

Au moins, je voudrais faire un try/catch sur le cellForItemAtIndexPath, mais je ne sais pas où je mettrais le try/catch. Peut-être dans une coutume UICollectionView?

Merci!

+0

Je commencerais par ajouter des instructions NSLog() dans 'numberOfItemsInSection' et dans' cellForItemAtIndexPath' pour vérifier le 'directoryID' et la valeur de [[photos objectForKey: api.directoryID] count]'. –

+0

Oui, j'ai déjà fait ça. Et aussi imprimé le 'indexPath.row' pour chaque cellule. Il imprime les habituels, "1, 2, 3, 4, 5, 6, etc" jusqu'au dernier élément, puis pointe sur un index extravaguant à la fin. – pierceography

+0

'NSLog' le' collectionView' dans les méthodes. Une installation avec plus d'un 'UICollectionView' m'a mordu une fois, puisque je n'ai pas gardé la vue de la collection 'correcte' et que j'ai opéré la mauvaise (cela m'a aussi donné des erreurs 'out of bounds'). – SAE

Répondre

3

Le problème est ici:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section { 
    return [[photos objectForKey:api.directoryID] count]; 
} 

Je suppose que vous utilisez un délégué et objet dataSource pour tous vos cas UICollectionView. Si oui, réécrire votre code de cette manière:

- (NSInteger)collectionView:(UICollectionView *)view 
     numberOfItemsInSection:(NSInteger)section 
{ 
    if (view == _firstCollectionView) 
    { 
     return [[photos objectForKey:api.directoryID] count]; 
    } 
    else if (view == _secondCollectionView) 
    { 
     return ...; 
    } 
} 

Aussi, vous devez réécrire la méthode collectionView:cellForItemAtIndexPath: de telle manière.

Questions connexes