web-dev-qa-db-fra.com

UICollectionView: Comment obtenir la vue d'en-tête pour une section?

Il existe une méthode pour obtenir une cellule par indexPath (UICollectionView cellForItemAtIndexPath:). Mais je ne peux pas trouver de méthode pour obtenir l’une des vues supplémentaires telle qu’un en-tête ou un pied de page, une fois créée. Des idées?

28
Dorian Roy

METTRE À JOUR

Depuis iOS 9, vous pouvez utiliser -[UICollectionView supplementaryViewForElementKind:atIndexPath:] pour obtenir une vue supplémentaire par chemin d'index.

ORIGINAL

Votre meilleur choix est de créer vos propres chemins d'index de mappage de dictionnaire en vues supplémentaires. Dans votre méthode collectionView:viewForSupplementaryElementOfKind:atIndexPath:, insérez la vue dans le dictionnaire avant de la renvoyer. Dans votre collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:, supprimez la vue du dictionnaire.

42
rob mayoff

Je voudrais partager mon aperçu de la solution proposée par rob mayoff mais je ne peux pas poster de commentaire, je le mets ici:

Pour chacun d'entre vous qui a essayé de garder la référence des vues supplémentaires utilisées par une vue de collection, mais qui rencontrait des problèmes de perte de piste trop tôt en raison de:

collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:

étant appelé trop de fois, essayez d’utiliser un NSMapTable au lieu d’un dictionnaire.

J'utilise

@property (nonatomic, strong, readonly) NSMapTable *visibleCollectionReusableHeaderViews;

créé comme ceci:

_visibleCollectionReusableHeaderViews = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableWeakMemory];

de sorte que lorsque vous gardez une référence à une vue supplémentaire:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    // ( ... )
    [_visibleCollectionReusableHeaderViews setObject:cell forKey:indexPath];

il ne conserve qu'une faible référence dans la table NSMapTable et le conserve aussi longtemps que l'objet n'est pas désalloué!

Vous n'avez plus besoin de supprimer la vue de

collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:

nSMapTable perdra l’entrée dès que la vue sera désallouée.

26
Bluezen

La première chose à faire est de cocher la case "En-tête de section" dans l'inspecteur d'attributs de la vue Collection. Ajoutez ensuite une vue de collection réutilisable comme vous avez ajouté votre cellule à la vue de collection, écrivez un identifiant et créez une classe pour celle-ci si vous en avez besoin. Puis implémentez la méthode:

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

À partir de là, faites exactement comme vous le faites avec cellForItemAtIndexPath Il est également important de spécifier si c’est un en-tête ou un pied de page sur lequel vous codez:

if([kind isEqualToString:UICollectionElementKindSectionHeader])
{
    Header *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerTitle" forIndexPath:indexPath];
    //modify your header
    return header;
}

else
{

    EntrySelectionFooter *footer = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"entryFooter" forIndexPath:indexPath];
    //modify your footer
    return footer;
}

utilisez indexpath.section pour savoir dans quelle section il se trouve Notez également que Header et EntrySelectionFooter sont des sous-classes personnalisées de UICollectionReusableView que j'ai créées.

9
Alex

Cette méthode est souvent suffisante pour recharger des vues supplémentaires à l'écran:

collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader)
0
ullstrm