tutorial custom collection xcode interface-builder ios6 uicollectionview

xcode - custom - uicollectionview header



UICollectionView no contiene UICollectionViewCell en IB (4)

Estoy intentando agregar un UICollectionView a un archivo .nib en IB. He trabajado a través de algunos tutoriales y no tuve problemas.

En mi aplicación existente, cuando arrastro una vista de colección a una vista en IB y luego amplío el objeto, el diseño de flujo de CollectionView está allí, pero no hay una celda de vista de colección. Tampoco puedo arrastrar y soltar una celda en la vista de colección. Además, la vista de colección se muestra de forma diferente, mostrando una imagen de una cuadrícula de celdas en lugar del cuadro blanco normal.

He intentado crear un nuevo controlador de vista con nib y tengo los mismos resultados al agregar un collectionView.

Esta aplicación estaba dirigida a iOS 4.2, pero he cambiado el objetivo de implementación a iOS 6.

En cualquier proyecto de nueva creación no obtengo este comportamiento.


Defina su vista de celda en un archivo de plumilla separado. La vista debe ser de tipo UICollectionViewCell o una subclase.

Luego, debe registrar la punta con su vista de colección:

- (void)viewDidLoad { UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil]; [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"]; }


Ha pasado un tiempo desde que se hizo la pregunta, pero últimamente tuve el mismo problema.

Finalmente, encontré la respuesta here .

En breve:

  • No puede arrastrar y soltar un UICollectionViewCell en un UICollectionView si está en un archivo .xib. Esto solo es posible en un guión gráfico.
  • La solución es crear un archivo .xib para su celda personalizada y registrar la celda manualmente utilizando:

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];


No puedo decir por qué no funciona, pero para mí el enfoque de subclase de esta publicación del blog resolvió el problema:

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

Aquí hay un breve resumen:

  • cree una nueva clase MyViewCell que amplíe UICollectionViewCell y cree propiedades, acciones, puntos de venta y métodos según sea necesario.

@interface MyViewCell : UICollectionViewCell

  • cree una vista (archivo xib) con una celda de vista de colección como su objeto raíz (y elimine el objeto que se crea por defecto).
  • en los atributos, establezca la clase personalizada de esta celda de vista de colección a su clase ampliada MyViewCell (en lugar de la UICollectionViewCell predeterminada).
  • En los atributos de la vista reutilizable de la colección, defina un identificador, por ejemplo, myCell, necesitará esto más adelante para registrar su llamada.
  • regrese a su clase personalizada y modifique el método inithWithFrame para cargar y usar su vista creada.

    - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil]; if ([arrayOfViews count] < 1) { return nil; } if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; } self = [arrayOfViews objectAtIndex:0]; } return self; }

  • luego puede registrar esta clase para ser utilizada por el collectionView con

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];


Si bien estas respuestas son correctas, la causa subyacente del problema es bastante sutil y Apple necesita actualizar su mensaje de error en el registro. Cuando veas:

Unknown class MyViewCell in Interface Builder file.

Lo que realmente significa es que a su código fuente le falta la declaración @implementation o que el archivo .m no se ha agregado al destino. Así que revisa tu código y asegúrate de tener:

@implementation MyViewCell @end

Esto es cierto tanto para UITableViewCell como para UICollectionViewCell.

Discuto el problema más a fondo en https://.com/a/12755891/539149 para el caso general.

Lo interesante es que si te falta la @implementación y llamas:

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"];

Ya verás:

Undefined symbols for architecture armv7: "_OBJC_CLASS_$_MyViewCell", referenced from: objc-class-ref in MyViewController.o ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Así que Apple conoce el problema, simplemente no lo detectan durante la compilación. No aconsejaría poner celdas personalizadas en puntas separadas o llamar a registerClass: forCellWithReuseIdentifier :. Es mucho más limpio almacenar la celda personalizada dentro de su contenedor UICollectionView o UITableView en Interface Builder.