1

Je suis un en-tête pour la mise en œuvre de mon UICollectionView en ce moment, et je me bats en ce moment depuis l'en-tête est appelé une seule fois sur la première cellule.tête UICollectionView est appelée une seule fois sur la première cellule

C'est ce que je l'ai fait - je déclaré UICollectionViewFlowLayout pour faire un programme UICollectionView - dans ce cas, pickView. Et puis j'ai ajouté deux fichiers xib - un pour la cellule, et l'autre pour l'en-tête. Je me suis inscrit ces fichiers en vue de collection comme ceci:

UICollectionViewFlowLayout *layout2 = [[UICollectionViewFlowLayout alloc] init]; 

self.pickView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, pointView_y, pointView_width, pointView_length) collectionViewLayout:layout2]; 
self.pickView.backgroundColor = [UIColor whiteColor]; 
[self.pickView registerNib:[UINib nibWithNibName:@"TodayCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"TodayCollectionViewCell"]; 

[self.pickView registerNib:[UINib nibWithNibName:@"PickCollectionReusableView" bundle:[NSBundle mainBundle]] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"PickCollectionReusableView"]; 
//layout2.headerReferenceSize = CGSizeMake(_screenWidth, 50); 

[self.pickView setDataSource:self]; 
[self.pickView setDelegate:self]; 
[self.view addSubview:self.pickView]; 

Et puis je déclare la taille de vue d'en-tête comme ceci:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { 

    return CGSizeMake([Util screenWidth], 50); 
} 

Et enfin j'ai appelé viewForSupplementaryElementOfKind appeler les fichiers d'en-tête comme ceci:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 


    PickCollectionReusableView *reusableview = (PickCollectionReusableView*) [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"PickCollectionReusableView" forIndexPath:indexPath]; 



    PickCellVariable *buf = (PickCellVariable*) _pickArray[indexPath.row]; 
    NSLog(@"buf id = %@, SECTION = %lu", buf.itemID, (long)indexPath.row); 

    if(buf != nil) { 
     //reusableview.thumbPic = ; 
     [reusableview.brandName setTitle:[NSString stringWithFormat:@"%lu", (long)indexPath.row] forState:UIControlStateNormal]; 
     [[reusableview brandName] setBrandName:buf.brandname]; 
     [[reusableview brandName] addTarget:self action:@selector(brandClick:) forControlEvents:UIControlEventTouchUpInside]; 

     [[reusableview settingButton] addTarget:self action:@selector(setting:) forControlEvents:UIControlEventTouchUpInside]; 


     return reusableview; 
    } 
    else { 

     [[reusableview brandName] setBrandName:@""]; 

     return reusableview; 
    } 



} 

Je mis le point d'arrêt et a ajouté la ligne NSLog pour vous assurer que viewForSupplementaryElementOfKind est appelée une seule fois, dans la première cellule. J'ai essayé de trouver des cas comme le mien, mais la plupart des problèmes concernant l'en-tête UICollectionView sont quand ils ont enregistré la classe au lieu d'enregistrer le fichier xib, ou ils ont oublié de définir la taille de l'en-tête. Le mien n'est appelé qu'une seule fois, il ne s'agit donc pas d'un chevauchement. Ma vue de collection est programmée, donc je ne redéfinis rien pour le moment.

Quel pourrait être le problème? S'il vous plaît, tout peut aider ici.

Merci.

+0

est-il une seule section que vous avez défini? Si c'est le cas, le 'viewForSupplementaryElementOfKind' sera appelé une fois. – liushuaikobe

+0

Ok. C'était si simple que cela m'a vraiment embarrassé. Je ne peux pas croire que j'ai passé presque une journée pour ça ... Eh bien, leçon apprise. En tout cas, merci pour une réponse si rapide! – 14c

+0

OK. Heureux de vous aider. – liushuaikobe

Répondre

1

Ok, donc mon problème est que j'ai appelé mes données sur une base row. Cependant, pour que l'en-tête apparaisse sur chaque cellule, vous devez appeler vos données au section. J'espère que personne ne se bat plus comme moi en termes de cette question.

+0

mon problème était 'headerView.headerTitle.text = catégories [indexPath.row] .name', doivent changer de' catégories [indexPath.section] ' – Timeless