UICollectionView y UICollectionReusableView personalizados no funciona

Estoy intentando usar UICollectionReusableView personalizado (que tiene class propia y XIB) en mi encabezado UICollectionView . Pero después de search datos en el lugar del encabezado no tengo nada.

Mis pasos:

  1. Registro de class en viewDidLoad :

      [self.collectionView registerClass:[CollectionViewHeader class] forSupplementaryViewOfKind: UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView"]; 
  2. Tratando de mostrar:

     - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableView = nil; if (kind == UICollectionElementKindSectionHeader) { CollectionViewHeader *collectionHeader = [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath]; NSInteger section = [indexPath section]; id <NSFetchedResultsSectionInfo> sectionInfo = [fetchRecipes sections][section]; collectionHeader.headerLabel.text = @"bla-bla-bla"; reusableView = collectionHeader; } return reusableView; } 

¿Alguien puede decirme qué sucede? ) Gracias por cualquier consejo

Creo que está agregando label a la xib. Por lo tanto, necesita registrarNib: para la vista del encabezado en lugar de registrarseClase:

  1. Registre su encabezado nib / xib en la sección viewDidLoad.

     [self.collectionView registerNib: [UINib nibWithNibName:@"headerCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"headerCell"]; 
  2. Cree la celda de vista suplementaria personalizada.

     - (headerCollectionViewCell *)collectionView:(UICollectionView *)collectionViews viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableView = nil; if (kind == UICollectionElementKindSectionHeader) { UINib *nib = [UINib nibWithNibName:@"headerCollectionViewCell" bundle:nil]; [collectionViews registerNib:nib forCellWithReuseIdentifier:@"headerCell"]; headerCollectionViewCell *collectionHeader = [collectionViews dequeueReusableCellWithReuseIdentifier:@"headerCell" forIndexPath:indexPath]; collectionHeader.titleLabel.text = @"What"; reusableView = collectionHeader; } return reusableView; } 

Solo en caso de que alguien necesite una solución. No tiene que registrar la class de encabezado usando

 [self.collectionView registerClass:...] 

Simplemente use el método delegado del layout para devolver la class de encabezado.

En realidad, puede haber algunas razones:

  1. (más común) Si agrega u supplementaryView en el guión gráfico y luego intente registrar la class

     [self.stickyCollectionView registerClass:[<CLASSFORSUPPLEMENTARYVIEWW> class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:NSStringFromClass([<CLASSFORSUPPLEMENTARYVIEWW> class])]; 

Obtendrás la vista suplementaryView , pero no creas (una estándar): verás obj, pero en realidad será como marcador de position.

Ejemplo:

introduzca la descripción de la imagen aquí

Aquí se puede ver que obj se creó, pero las salidas son nulas (en este caso simple, solo una salida – _monthNameLabel ).

  1. Veo algunas veces este problema también

Si crea Obj por separado para manejar dataSourse / delegate para collectionView y agregue una salida de reference, y en los methods init , intente registrar la class en su salida (suponiendo que la vista se creó en un file de nib separado), u también recibirá el mismo resultado anterior, pero la razón es otra: nuestra salida es nula aquí:

introduzca la descripción de la imagen aquí

Como solución, por ejemplo, puede usar un configurador personalizado para esto, como:

 #pragma mark - CustomAccessors - (void)setcCollectionView:(UICollectionView *)collectionView { _collectionView = collectionView; [self.stickyCollectionView registerNib:...]; } 
  1. como lo sugiere @Anil Varghese

Puedes usar registerClass lugar de registerNib