UICollectionView: ¿Cómo obtener la vista de encabezado de una sección?


Hay un método para obtener una celda por indexPath (UICollectionView cellForItemAtIndexPath:). Pero no puedo encontrar un método para obtener una de las vistas suplementarias como un encabezado o pie de página, después de que se ha creado. Alguna idea?

Author: Emil, 2012-11-15

4 answers

ACTUALIZAR

A partir de iOS 9, puede usar -[UICollectionView supplementaryViewForElementKind:atIndexPath:] para obtener una vista suplementaria por ruta de índice.

ORIGINAL

Su mejor apuesta es hacer su propio diccionario mapeando rutas de índice a vistas suplementarias. En su método collectionView:viewForSupplementaryElementOfKind:atIndexPath:, ponga la vista en el diccionario antes de devolverla. En su collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:, elimine la vista del diccionario.

 40
Author: rob mayoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-12 20:59:44

Me gustaría compartir mi visión de la solución proporcionada por rob mayoff pero no puedo publicar un comentario, así que lo estoy poniendo aquí:

Para cada uno de ustedes que trató de mantener la referencia de las vistas suplementarias que se utilizan por una vista de colección, pero que se encuentran con problemas de perder la pista demasiado pronto debido a

collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:

Siendo llamado demasiadas veces, intente usar un NSMapTable en lugar de un diccionario.

Utilizo

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

Creado así:

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

De modo que cuando usted está manteniendo 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 a él en el NSMapTable y lo mantiene MIENTRAS el objeto no esté desasignado!

Ya no es necesario eliminar la vista de

collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:

As the NSMapTable perderá la entrada tan pronto como la vista sea desasignada.

 24
Author: Bluezen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-12 02:47:24

Lo primero que tiene que hacer es marcar la casilla "Encabezado de sección" en el inspector de atributos de la vista de colección. Luego agregue una vista reutilizable de colección al igual que agregó su celda a la vista de colección, escriba un identificador y cree una clase para ella si es necesario. Luego implementa el método:

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

A partir de ahí haz exactamente lo que hiciste con cellForItemAtIndexPath También es importante especificar si es 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.sección a conocer en qué sección está esto también tenga en cuenta que Header y EntrySelectionFooter son subclases personalizadas de UICollectionReusableView que hice

 8
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-15 03:32:59

Este método es a menudo suficiente para servir al propósito de recargar vistas suplementarias en pantalla:

collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader)
 0
Author: ullstrm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 08:20:10