UICollectionView registerClass: метод forCellWithReuseIdentifier прерывает UICollectionView

Какова роль метода registerClass:forCellWithReuseIdentifier:? Согласно документации разработчика Apple, она должна

"Зарегистрируйте класс для использования при создании новых ячеек просмотра коллекции".

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

#define cellId @"cellId"
#import "ViewController.h"
#import "Cell.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@property(strong, nonatomic)NSMutableArray * photoArray;


@end

@implementation ViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%@",_photoArray);
    _photoArray = [[NSMutableArray alloc]initWithCapacity:0];
    [_collectionView registerClass:[Cell class] forCellWithReuseIdentifier:cellId];
    for(int i=1;i<=12;i++)
    {
        NSString * imgName = [NSString stringWithFormat:@"%d.png",i];
        UIImage *img  = [UIImage imageNamed:imgName];
        [_photoArray addObject:img];
    }
}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return _photoArray.count;
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    Cell* cell = [_collectionView  dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
    cell.cellImage.image = [_photoArray objectAtIndex:indexPath.row];
    return cell;
}

Если вы уже создали свой UICollectionView в Storyboard, связали ваши dataSource и delegate, и вы добавили все необходимые методы:

Тогда метод registerClass/registerCell не требуется. Однако, если вам нужно повторно использовать представление, данные или ячейки, вы должны использовать эти методы, чтобы iOS могла заполнить ваш UICollectionView по мере необходимости. Это также можно сделать в вашей раскадровке, установив Prototype Cell (тот же принцип, что и метод registerClass.

Кроме того, если вы ищете хорошее объяснение того, что делает registerCell и как его использовать, проверьте эту ссылку и перейдите в нижнюю часть под названием "Повторное использование ячейки и просмотра".

32
ответ дан 14 окт. '12 в 20:58
источник

Соглашайтесь с ответом RazorSharp и хотел бы указать, что эта ключевая фраза для меня в Ссылка Techtopia:

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

4
ответ дан 20 янв. '13 в 13:06
источник