2013-05-13 3 views
22

я добавил представление коллекции в viewDidLoad, как это ...UICollectionViewCell подкласс инициализации никогда не запускать

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

И у меня есть подкласс UICollectionViewCell под названием CameraCell с инициализации, как это ...

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

Но когда я запускаю приложение, есть вид коллекции, и я могу прокручивать его, но я не вижу никаких ячеек. Я добавил точку останова в init, и она никогда не вызывается. Есть ли другой метод, который я должен переопределить?

EDIT

При входе в ячейку cellForItemAtIndexPath ...

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

    NSLog(@"%@", cell); 

    return cell; 
} 

Он отображает правильный класс ...

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

Я имею в виду, вы вызываете initWithFrame вместо инициализации ... – rocky

ответ

40

метод необходимо реализовать это - (instancetype)initWithFrame:(CGRect)rect

+1

OMG я не могу поверить, что я сделал это. Благодарю. – Fogmeister

+1

Но не является ли кадр, управляемый самим 'collectionView' - рендеринг этого' initWithFrame' из 'collectionViewCell' бесполезен? – Honey

+3

Аргумент frame, который вы получаете, бесполезен, но вам все равно придется инициализировать свои собственные свойства здесь. – Aleph7

27

Я недавно попробовал это в SDK iOS7, и мне пришлось переопределить initWithCoder, потому что initWithFrame так и не был вызван.

+1

Вы загружали его из раскадровки или кинжала? Или все в коде? – Fogmeister

+0

Клетка загружается с раскадровки. –

+31

^Тогда вот почему. 'initWithCoder' - назначенный инициализатор для представлений, построенных из раскадровки. 'initWithFrame' предназначен для представлений, которые создаются программно. –

-1

В моем случае, когда я использую [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 10, 10) collectionViewLayout:flowLayout], чтобы запрограммировать экземпляр коллекции, initWithFrame никогда не вызывался, но initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout сделал.

9

Если ячейка загружается из раскадровки, то вы хотите, чтобы переопределить инициализаторами как это:

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 
} 

If вы загружаетесь с наконечника, тогда вы захотите переопределить инициализаторы следующим образом:

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 
} 
Смежные вопросы