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?
Depuis iOS 9, vous pouvez utiliser -[UICollectionView supplementaryViewForElementKind:atIndexPath:]
pour obtenir une vue supplémentaire par chemin d'index.
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.
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.
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.
Cette méthode est souvent suffisante pour recharger des vues supplémentaires à l'écran:
collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader)