2013-05-13 12 views
22

Ho aggiunto una vista collezione in viewDidLoad come questo ...UICollectionViewCell sottoclasse init mai a corto

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]; 

E ho una sottoclasse UICollectionViewCell chiamato CameraCell con un init come questo ...

- (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; 
} 

Ma quando eseguo l'app, la vista raccolta è lì e posso scorrere ma non riesco a vedere nessuna cella. Ho aggiunto un punto di interruzione nel init della cella e non viene mai chiamato. C'è un altro metodo che devo scavalcare?

EDIT

Quando accedo la cella in cellForItemAtIndexPath ...

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

    NSLog(@"%@", cell); 

    return cell; 
} 

Esso mostra la classe corretta ...

<CameraCell: 0x1f07ba30; baseClass = UICollectionViewCell; frame = (0 20; 320 280); layer = <CALayer: 0x1f07bb40>> 
+1

Voglio dire, si sta chiamando initWithFrame invece di init ... – rocky

risposta

40

Il metodo è necessario implementare è - (instancetype)initWithFrame:(CGRect)rect

+1

OMG non riesco a credere di averlo fatto. Grazie. – Fogmeister

+1

Ma non è il frame governato da 'collectionView' stesso - rendendo inutile questo' initWithFrame' da 'collectionViewCell'? – Honey

+3

L'argomento del frame che ottieni è in qualche modo inutile, ma dovrai comunque inizializzare le tue proprietà qui. – Aleph7

27

L'ho provato di recente nell'SDK iOS7 e ho dovuto ignorare lo initWithCoder perché non è mai stato chiamato initWithFrame.

+1

Lo stavi caricando da uno storyboard o pennino? O tutto nel codice? – Fogmeister

+0

La cella viene caricata da uno storyboard. –

+31

^Allora è per questo. 'initWithCoder' è l'inizializzatore designato per le viste create dallo storyboard. 'initWithFrame' è per le viste che sono costruite programmaticamente. –

-1

Nel mio caso, quando sto utilizzando [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 10, 10) collectionViewLayout:flowLayout] per creare un'istanza di un oggetto ViewView, initWithFrame non viene mai chiamato, ma è stato fatto initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout.

9

Se la cella viene caricato da uno storyboard poi si desidera sovrascrivere le inizializzatori come questo:

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 
} 

Se si sta caricando da un pennino, quindi si vorrà sovrascrivere gli inizializzatori come questo:

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 
} 
Problemi correlati