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
}