web-dev-qa-db-fra.com

UICollectionView registerClass: la méthode forCellWithReuseIdentifier rompt UICollectionView

Quel est le rôle de registerClass:forCellWithReuseIdentifier: méthode? Selon la documentation des développeurs d'Apple, il est censé

"Enregistrer une classe à utiliser pour créer de nouvelles cellules de vue de collection."

Lorsque j'essaie de l'utiliser mon projet, j'obtiens une vue de collection noire. Quand je le supprime, tout fonctionne bien.

#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;
}
28
Janusz Chudzynski

Si vous avez déjà créé votre UICollectionView dans Storyboard, connecté vos dataSource et delegate, et vous avez ajouté toutes les méthodes requises:

La méthode registerClass/registerCell n'est alors pas requise. Cependant, si vous devez réutiliser une vue, des données ou des cellules, vous devez utiliser ces méthodes pour qu'iOS puisse remplir votre UICollectionView selon vos besoins. Cela peut également être fait dans votre Storyboard en définissant la cellule de prototype (le même principe que la méthode registerClass.

De plus, si vous cherchez une bonne explication sur ce que fait registerCell et comment l'utiliser, consultez ce lien et faites défiler jusqu'à la section inférieure intitulée "Réutilisation des cellules et des vues".

35
Samuel Spencer

Je suis d'accord avec réponse de RazorSharp et je voulais souligner que cette phrase clé pour moi dans le lien Techtopia est:

Si la classe de cellules a été écrite en code, l'enregistrement est effectué à l'aide de la méthode registerClass: de UICollectionView, sinon utilisez registerNib

4
Steve