uitableviewcell inside didselectitematindexpath ios uicollectionview uicollectionviewcell

ios - inside - UICollectionViewCell subclass init nunca se ejecuta



uicollectionview inside uitableviewcell (4)

He añadido una vista de colección 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 una subclase UICollectionViewCell llamada CameraCell con un inicio 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 aplicación, la vista de colección está ahí y puedo desplazarla pero no puedo ver ninguna celda. He añadido un punto de interrupción en el inicio de la celda y nunca se llama. ¿Hay otro método que tengo que anular?

EDITAR

Cuando registro la celda 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>>


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


En mi caso, cuando estoy usando [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 10, 10) collectionViewLayout:flowLayout] para crear una instancia de una colecciónView, nunca se llama a initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout , pero initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout hizo el initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout .


Recientemente probé esto en el SDK de iOS7, y tuve que anular initWithCoder porque nunca se llamó a initWithFrame .


Si la celda se carga desde un StoryBoard, entonces querrá anular los inicializadores de esta manera:

Rápido

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

C objetivo

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

Si está cargando desde una plumilla, entonces deberá anular los inicializadores de esta manera:

Rápido

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

C objetivo

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