iphone - uicollectionviewcontroller - uicollectionviewcell indexpath
UICollectionView: ¿Cómo obtener la vista de encabezado para una sección? (3)
Hay un método para obtener una celda mediante indexPath
( UICollectionView cellForItemAtIndexPath:
. Pero no puedo encontrar un método para obtener una de las vistas adicionales, como un encabezado o pie de página, una vez que se ha creado. ¿Alguna idea?
Me gustaría compartir mi visión de la solución proporcionada por rob mayoff, pero no puedo publicar comentarios, así que lo estoy poniendo aquí:
Para cada uno de ustedes que intentó mantener la referencia de las vistas suplementarias que utiliza una vista de colección, pero que se encuentra con problemas de perder la pista demasiado pronto debido a
collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:
al ser llamado demasiadas veces, intente utilizar un NSMapTable en lugar de un diccionario.
yo suelo
@property (nonatomic, strong, readonly) NSMapTable *visibleCollectionReusableHeaderViews;
creado así:
_visibleCollectionReusableHeaderViews = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableWeakMemory];
de modo que cuando mantiene una referencia a una vista suplementaria:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
// ( ... )
[_visibleCollectionReusableHeaderViews setObject:cell forKey:indexPath];
solo mantiene una referencia DÉBIL en NSMapTable y lo guarda MIENTRAS EL objeto no sea desasignado.
Ya no es necesario que elimines la vista de
collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:
como NSMapTable perderá la entrada tan pronto como la vista se desasigna.
ACTUALIZAR
A partir de iOS 9, puede usar -[UICollectionView supplementaryViewForElementKind:atIndexPath:]
para obtener una vista suplementaria por ruta de índice.
ORIGINAL
Su mejor opción es hacer sus propias rutas de índice de mapeo de diccionario a vistas suplementarias. En su método collectionView:viewForSupplementaryElementOfKind:atIndexPath:
coloque la vista en el diccionario antes de devolverlo. En su collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:
elimine la vista del diccionario.
Lo primero que debe hacer es marcar la casilla "Encabezado de sección" en el inspector de atributos de la vista de colección. A continuación, agregue una vista reutilizable de la colección al igual que agregó su celda a la vista de la colección, escriba un identificador y cree una clase si es necesario. Luego implementa el método:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
Desde allí, haga exactamente lo mismo que hizo con cellForItemAtIndexPath. También es importante especificar si se trata de un encabezado o pie de página sobre el que está codificando:
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;
}
use indexpath.section para saber en qué sección está esto y también tenga en cuenta que Header y EntrySelectionFooter son subclases personalizadas de UICollectionReusableView que hice