Estoy tratando de agregar un UICollectionView a una .archivo nib en IB. He trabajado a través de un par de tutoriales y no tuvimos problemas.

En mi aplicación existente, cuando arrastro una colección vista en una vista en IB y, a continuación, expanda el objeto, el CollectionView Diseño de Flujo está ahí , pero no hay ninguna vista de colección de la célula. Yo también puede arrastrar y soltar una celda en la vista de colección. También la colección se muestra la vista de manera diferente, mostrando una imagen de una cuadrícula de celdas en lugar de la normal de caja blanca.

He intentado crear un nuevo controlador de vista con punta, y tiene el mismo resultado cuando la adición de un collectionView.

Esta aplicación FUE dirigido a iOS 4.2, pero he cambiado el destino de la implementación a iOS 6.

En el recién creado proyectos no entiendo este comportamiento.

  • OK, parece que sólo puedes diseño de un UICollectionView completamente a través del IB en el interior de un storyboard. En un .punta de obtener el comportamiento que se describe anteriormente. En un guión, consigue el UICollectionViewCell con su UICollectionView. Qué pasa con eso???
  • teniendo este mismo problema, bastante molesto
  • Incluso en el guión gráfico, se puede monótona y caída de la vista de colección de células en una colección de objetos. No sé por qué.
  • tengo este mismo problema.
InformationsquelleAutor Alpinista | 2012-10-08

4 Comentarios

  1. 9

    No puedo decirte por qué no funciona, pero para mí la subclase enfoque de este blog resuelto el problema:

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

    aquí un breve resumen:

    • crear una nueva clase MyViewCell que se extiende UICollectionViewCell y crear propiedades, las acciones, los medios y métodos según sea necesario.

    @interface MyViewCell : UICollectionViewCell

    • crear una Vista (archivo xib) con una Vista de Colección de la Célula como su objeto de raíz (y eliminar el objeto que se crea por defecto).
    • en el conjunto de atributos de la clase personalizada de esta Colección Vista de la Celda a su clase extendida MyViewCell (en lugar de la predeterminada UICollectionViewCell).
    • en los atributos en Colección Reutilizables Vista de definir un Identificador, por ejemplo, myCell, la necesitará más adelante para registrar su llamada.
    • volver a tu clase personalizada y modificar el inithWithFrame método para cargar y utilizar su vista.

      - (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 registrar esta clase para ser utilizado por el collectionView con

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

    • Aunque esto, en teoría, puede responder a la pregunta, sería preferible para incluir las partes esenciales de la respuesta aquí, y proporcionar el enlace de referencia.
    • He añadido más información a la respuesta.
    • Impresionante! Sólo no olvides registrarte collectionView: [auto.collectionView registerClass:[MyViewCell clase] forCellWithReuseIdentifier:@»myCell»];
  2. 8

    Ha sido un tiempo desde que la pregunta se ha hecho, pero me enfrentamos al mismo problema últimamente.

    Finalmente, encontré la respuesta aquí.

    En resumen:

    • No se puede arrastrar y soltar un UICollectionViewCell en un UICollectionView si usted está en una .xib archivo. Esto sólo es posible en un storyboard.
    • La solución es crear un .xib archivo personalizado de la célula y para el registro de la celda de forma manual utilizando:

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

    • Esto es todavía un problema en Xcode 8.2.1. Yo creo que vamos a utilizar la solución para siempre.
    • Para la solución, tengo que usar registerNib, o de lo contrario el dequeueReusableCell es sólo una vista vacía, sin ningún tipo de información configurada en xib.
    • Lo mismo w/ Xcode 8.3. Por qué…
    • Lo mismo con Xcode 9.3.1
    • Lo mismo con Xcode 10.2.1
  3. 3

    Definir su celda ver por separado en un archivo nib. La vista debe ser de tipo UICollectionViewCell o de una subclase.

    A continuación, debe registrar la punta con tu colección:

    - (void)viewDidLoad
    {
        UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
        [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"];
    }
    • por alguna razón esto no funciona. al sacarlo de la cola de la célula, se produce una excepción: «nib debe contener exactamente un alto nivel de objeto, que debe ser un UICollectionReusableView instancia». esto es realmente extraño, ya que la documentación que se indica que «La punta del archivo debe contener sólo un objeto de nivel superior y que el objeto debe ser del tipo UICollectionViewCell».
    • UICollectionViewCell hereda de UICollectionReusableView.
  4. 0

    Aunque 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 está faltando el @ejecución declaración o que la .m archivo no se ha agregado a la meta. Así que revise su código y asegúrese de tener:

    @implementation MyViewCell
    
    @end

    Esto es cierto tanto para UITableViewCell y UICollectionViewCell.

    Me discutir el problema en https://stackoverflow.com/a/12755891/539149 para el caso general.

    Lo interesante es que si te falta el @ejecución y llame a:

    [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)

    Por lo que Apple sabe sobre el problema, simplemente no son su detección durante la compilación. Yo aconsejo poner custom células en distintas puntas o llamando registerClass: forCellWithReuseIdentifier:. Es mucho más limpio para almacenar la costumbre de células dentro de su contenedor UICollectionView o UITableView en el Interface Builder.

Dejar respuesta

Please enter your comment!
Please enter your name here