2012-10-08 64 views
16

Estoy tratando de agregar un UICollectionView a un archivo .nib en IB. He trabajado en algunos tutoriales y no tuve problemas.UICollectionView no contiene UICollectionViewCell en IB

En mi aplicación actual, cuando arrastro una vista de colección en una vista en IB y luego expandí 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 grilla de celdas en lugar de la caja blanca normal.

He intentado crear un nuevo controlador de vista con plumilla, y tengo los mismos resultados cuando agrego un collectionView.

Esta aplicación estaba apuntando a iOS 4.2, pero he cambiado el destino de despliegue a iOS 6.

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

+6

OK, parece que sólo se puede diseño de un UICollectionView completamente utilizando IB dentro de un guión gráfico. En una .nib obtienes el comportamiento que describí arriba. En un guión gráfico, obtienes el UICollectionViewCell con tu UICollectionView. ¿¿¿Que pasa con eso??? – Alpinista

+0

teniendo este mismo problema, más bien molesto – adit

+0

Incluso en el guión gráfico, no se puede deslizar y soltar la celda de vista de colección en un objeto de vista de colección. No estoy seguro por qué. – theiOSguy

Respuesta

3

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

A continuación, 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"]; 
} 
+2

por alguna razón, esto no funciona. al deseleccionar la celda, se lanza una excepción: "nib debe contener exactamente un objeto de nivel superior que debe ser una instancia de UICollectionReusableView". esto es realmente extraño, ya que la documentación indica que "el archivo nib debe contener solo un objeto de nivel superior y ese objeto debe ser del tipo UICollectionViewCell". – DELUXEnized

+0

UICollectionViewCell hereda de UICollectionReusableView. –

8

No puedo decir por qué no funciona, pero para mí el enfoque subclase de esta entrada del blog resuelto el problema:

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

aquí es un breve resumen:

  • crear una nueva clase MyViewCell que extiende UICollectionViewCell y crea propiedades, acciones, salidas y métodos según sea necesario.

@interface MyViewCell : UICollectionViewCell

  • crear una vista (archivo xib) con una colección Ver celda como su objeto raíz (y eliminar el objeto que se crea por defecto).
  • en los atributos establezca la clase personalizada de esta celda de vista de colección en su clase extendida MyViewCell (en lugar de la UICollectionViewCell predeterminada).
  • en los atributos en Colección Vista reutilizable definir un Identificador, p. myCell, necesitarás esto luego para registrar tu 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; 
    } 
    
  • entonces usted puede inscribirse esta clase para ser utilizado por el CollectionView con

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

+0

Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (http://meta.stackexchange.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. –

+0

He agregado más detalles a la respuesta. – DELUXEnized

+0

¡Impresionante! Simplemente no se olvide de registrar collectionView: [self.collectionView registerClass: [Clase MyViewCell] forCellWithReuseIdentifier: @ "myCell"]; – atulkhatri

0

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 vea:

Unknown class MyViewCell in Interface Builder file. 

Lo que realmente significa es que su código fuente no se encuentra la declaración @implementation o que el archivo .m no ha sido añadido a la meta. A fin de comprobar su código y asegurarse de que tiene:

@implementation MyViewCell 

@end 

Esto es cierto tanto para UITableViewCell y UICollectionViewCell.

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

Lo interesante es que si se echa en falta la @implementation y llamar:

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

verá:

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 sabe sobre el problema, sólo aren' t detectarlo durante la compilación. Aconsejaría no poner células personalizadas en plumillas 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.

8

Ha pasado un tiempo desde que se hizo la pregunta pero me enfrenté al mismo problema últimamente.

Finalmente, encontré la respuesta here.

En resumen:

  • No se puede arrastrar y soltar un UICollectionViewCell en un UICollectionView si se encuentra 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 personalizado y registrar la celda manualmente usando:

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

+0

Esto sigue siendo un problema en Xcode 8.2.1.Creo que tenemos que usar la solución para siempre. –

+0

Para la solución alternativa, tengo que usar registerNib, o bien dequeueReusableCell es solo una vista vacía, sin ninguna información configurada en xib. –

+0

Todavía igual con Xcode 8.3. Por qué... – Jonny

Cuestiones relacionadas