He añadido una colección vista en viewDidLoad como este…

self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 10, 10) collectionViewLayout:flowLayout];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
self.collectionView.backgroundColor = [UIColor whiteColor];
[self.collectionView registerClass:[CameraCell class] forCellWithReuseIdentifier:CameraCellReuseIdentifier];
[self.collectionView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:self.collectionView];

Y tengo un UICollectionViewCell subclase llamada CameraCell con un init como este…

- (id)init
{
    self = [super init];
    if (self) {
        //Add customisation here...
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageChanged:) name:@"image" object:nil];

        self.contentView.backgroundColor = [UIColor yellowColor];

        self.imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
        self.imageView.contentMode = UIViewContentModeScaleAspectFill;
        self.imageView.clipsToBounds = YES;
        [self.imageView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.contentView addSubview:self.imageView];

        NSDictionary *views = NSDictionaryOfVariableBindings(_imageView);

        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imageView]|"
                                                                                 options:0
                                                                                 metrics:nil
                                                                                   views:views]];

        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[_imageView]|"
                                                                                 options:0
                                                                                 metrics:nil
                                                                                   views:views]];
    }
    return self;
}

Pero cuando ejecuto la app de la colección es de allí y me puede desplazarse por él pero no puedo ver ninguna de las celdas. He añadido un punto de interrupción en la celda de inicio (init) y nunca se llama. Hay otro método que tengo para anular?

EDITAR

Cuando me conecto el celular en cellForItemAtIndexPath…

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CameraCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CameraCellReuseIdentifier forIndexPath:indexPath];

    NSLog(@"%@", cell);

    return cell;
}

Muestra la clase correcta…

<CameraCell: 0x1f07ba30; baseClass = UICollectionViewCell; frame = (0 20; 320 280); layer = <CALayer: 0x1f07bb40>> 
  • Quiero decir, que está llamando initWithFrame en lugar de init…
InformationsquelleAutor Fogmeister | 2013-05-13

4 Comentarios

  1. 43

    El método que usted necesita para implementar es - (instancetype)initWithFrame:(CGRect)rect

    • OMG no puedo creer que hice eso. Gracias.
    • Pero no es el marco regido por collectionView sí mismo de representación de este initWithFrame de la collectionViewCell inútil?
    • El marco argumento que se obtiene es algo inútil, pero usted todavía necesita para inicializar las propiedades aquí.
  2. 27

    Recientemente he intentado esto en el iOS7 SDK, y tuve que anular initWithCoder porque initWithFrame nunca fue llamado.

    • Se le carga a partir de un guión gráfico o plumilla? O todos en el código?
    • El celular se carga a partir de un Guión gráfico.
    • ^Entonces es por eso. initWithCoder es el inicializador designado para las vistas construido a partir del storyboard. initWithFrame es para las vistas que se construyen a través de programación.
    • Problema frecuente 🙂 yo suelo poner toda la construcción en init, y luego llamarlo desde reemplazado initWithFrame y initWithCoder. esto hace que la clase de células más universal. O, cuando tengo que guardar original initWithCoder comportamiento, hago otro método universalInit, poner todo mi código personalizado allí y llamar a él desde todos los inicializadores. Por supuesto, con Swift este truco no es más práctico.
  3. 12

    Si el celular se carga a partir de un Guión gráfico a continuación, se desea reemplazar los inicializadores de como esta:

    Swift

    override init?(coder aDecoder: NSCoder) {
      super.init(coder:aDecoder)
      //You Code here
    } 

    Objective-C

    - (id)initWithCoder:(NSCoder *)aDecoder {
      self = [super initWithCoder:aDecoder];
      //You code here
    }

    Si se carga desde una punta, entonces usted tendrá que reemplazar la inicializadores como este:

    Swift

    override init(frame: CGRect) {
      super.init(frame:frame)
      //You Code here
    } 

    Objective-C

    - (id)initWithFrame:(CGRect)frame {
      self = [super initWithFrame:frame];
      //You code here
    }
  4. -1

    En mi caso, cuando estoy usando [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 10, 10) collectionViewLayout:flowLayout] a través de programación crear una instancia de un collectionView, initWithFrame nunca te llama, pero initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout hizo.

Dejar respuesta

Please enter your comment!
Please enter your name here