UICollectionView & collectionView:cellForItemAtIndexPath: non appelée
Hello tout l'monde.
Bon alors voilà , j'ai un p'tit soucis, et je pense que c'est sûrement une erreur débile que je ne vois pas.
Mon UICollectionView est rajoutée par code.
Mon soucis est que le collectionView:cellForItemAtIndexPath: n'est pas appelé.
.h :
@interface MaClasseController : UIViewController < UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout >
{}
.m :
@property (nonatomic, strong) UICollectionView *collection;
(void)viewDidLoad
{
_cellWidth = 80;
UICollectionViewFlowLayout *collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
[collectionViewLayout setItemSize:CGSizeMake(100, 100)];
[collectionViewLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[collectionViewLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[collectionViewLayout setMinimumInteritemSpacing:5.0];
[collectionViewLayout setMinimumLineSpacing:5.0];
_collection = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, [[UIScreen mainScreen] bounds].size.width, 200)
collectionViewLayout:collectionViewLayout];
[_collection setBackgroundColor:[UIColor yellowColor]];
[_collection registerClass:[CustomCollectionViewCell class] forCellWithReuseIdentifier:@Cell];
[_collection setDataSource:self];
[_collection setDelegate:self];
DLogLL(@DataSource: %@", [_collection dataSource]);
DLogLL(@Delegate: %@", [_collection delegate]);
[[self view] addSubview:_collection];
[_collection reloadData];
[super viewDidLoad];
}
Ces 2 méthodes sont appelées :
numberOfSectionsInCollectionView: return 1
collectionView:numberOfItemsInSection: return 1+ [arraySource count]
Mon UICollectionView apparait bien sur mon iPhone, j'ai bien un gros truc jaune qui apparait, mais reste vide.
Alors, j'ai regardé sur le web, et en général, c'est parce que le dataSource n'est pas mis.
Je l'ai fait, j'ai bien mis [_collection setDataSource:self];. De plus, pas de warning sur cette ligne signifiant qu'elle n'est pas conforme à ce protocol, et pas de ligne indiquant que la méthode qui ne veut pas être appelée n'est pas présente (vu qu'elle n'est pas optional) dans mon code.
Une autre possibilité, c'est que la UICollectionView ne laisserait pas d'item visibles.
J'ai mis une taille de 200, pour des cellules de 80. Donc normalement, il y a un moins un élément qui devrait être appelé.
Donc bon voilà , comme je l'ai dit, j'dois rater un truc tout con, et je n'arrive pas à avoir suffisamment de recul pour le trouver.
Merci de toute aide/piste d'avance.
Réponses
Bonjour,
je pense qu'il faut mettre ton code après le [super viewDidLoad]
Denis
Aucun changement.
Je ne fais rien de spécial qui demanderait au super viewDidLoad d'être appelé auparavant.
je viens de faire un petit build de test (iPad), en reprenant ton code
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
est bien appelée, (je lui faire retourner nil donc il aime pas, mais il s'arrête sur mon point d'arrêt), tu n'as rien dans d'autres call backs (comme viewWillAppears:) ?
J'viens de trouver la raison.
Me manque plus qu'à la corriger (et trouver où c'est).
J'ai mis 6, dans le retour de collectionView:numberOfItemsInSection.
Et du coup, j'en vois "6" (enfin un peu moins, faut scroller).
En fait, le soucis vient du fait que un de mes items est caché sur la gauche. J'ai remarqué quand en forçant à 2 le nombres d'items que j'avais une mini-bande sur la gauche de mon UICollectionView.
J'ai une sorte de contentOffset mal configuré. Pas encore compris pourquoi.
que se passe-t-il quand tu fais dessiner quelque chose dans tes cells ?
en mettant par exemple
- (void)drawRect:(CGRect)rect
{
// Drawing code
[super drawRect:rect];
[[UIColor redColor] setFill];
UIBezierPath *aPath = [UIBezierPath bezierPathWithRect:rect];
[aPath fill];
}
dans ta CustomCollectionViewCell
ok, j'avais fais un petit test par curiosité, mes cellules s'affichaient bien, mais je les ai colorées pour pouvoir les visualiser
Essaye de changer la taille des cellules et/ou du layout (même si à vue d'oeil ça me paraà®t correct.). Ajoute des couleurs aux cellules aussi pour les identifier.
Edit : Trop tard !
Je les avais également colorées, en rouge.
Mais, je le faisais dans cette fichue méthode qui n'était pas appelée.
Et comme la cellule était cachée, cette méthode n'était pas appelée.
Double post, sorry.
Du coup, c'est la contentSize qui est mauvaise.
Apparemment, j'ai vu quelques posts dessus sur le web, pas encore tout capté, mais j'vais creuser.
En bref, je devrais normalement avoir (quand j'ai setté à 6 le nombre de cells) : 6*80+5*1 (485), avec 80 la largeur, et 1 l'espace entre. Hors, j'ai 329 en width de la contentSize.