2013-05-13 5 views
22

Ich habe eine Sammlung Ansicht in viewDidLoad wie folgt hinzugefügt ...UICollectionViewCell Unterklasse init laufen nie

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

Und ich habe eine UICollectionViewCell Unterklasse CameraCell mit einem init so aufgerufen ...

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

Aber wenn ich die App starte, ist die Sammlungsansicht da und ich kann sie scrollen, aber ich kann keine Zellen sehen. Ich habe einen Breakpoint in der Zelle init hinzugefügt und es wird nie aufgerufen. Gibt es eine andere Methode, die ich überschreiben muss?

EDIT

Wenn ich die Zelle in cellForItemAtIndexPath log ...

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

    NSLog(@"%@", cell); 

    return cell; 
} 

Es zeigt die richtige Klasse ...

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

Ich meine, sind Sie Initwithframe statt init ... – rocky

Antwort

40

Die Methode, die Sie implementieren müssen - (instancetype)initWithFrame:(CGRect)rect

+1

OMG Aufruf Ich kann nicht glauben, dass ich das getan habe. Vielen Dank. – Fogmeister

+1

Aber wird der Frame nicht von 'collectionView' selbst gesteuert - und macht 'initWithFrame' aus der' collectionViewCell' unbrauchbar? – Honey

+3

Das Rahmenargument, das Sie erhalten, ist irgendwie nutzlos, aber Sie müssen Ihre eigenen Eigenschaften hier noch initialisieren. – Aleph7

27

Ich habe dies kürzlich im iOS7 SDK versucht, und ich musste überschreiben, weil initWithFrame nie aufgerufen wurde.

+1

Haben Sie es von einem Storyboard oder einer Feder geladen? Oder alles im Code? – Fogmeister

+0

Die Zelle wird von einem Storyboard geladen. –

+31

^Dann deshalb. 'initWithCoder' ist der designierte Initialisierer für Ansichten, die aus dem Storyboard erstellt wurden. 'initWithFrame' ist für Ansichten, die programmatisch erstellt werden. –

-1

In meinem Fall, wenn ich [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 10, 10) collectionViewLayout:flowLayout] programmatisch instanziieren eine CollectionView, initWithFrame nie aufgerufen, aber initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout tat.

9

Wenn die Zelle aus dem Storyboard geladen wird, dann werden Sie die initializers wie diese außer Kraft zu setzen:

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 
} 

Wenn Sie laden von einer Spitze, dann wollen Sie die Initialisierer wie folgt überschreiben:

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 
} 
Verwandte Themen