web-dev-qa-db-fra.com

UICollectionView: doit être initialisé avec un paramètre de disposition non nul

J'ai ajouté UICollectionView par code.
Maintenant, l'application plante avec le message suivant: UICollectionView must be initialized with a non-nil layout parameter.
Avez-vous une idée pour le réparer?
CollectionCell est une classe personnalisée de UICollectionViewCell.

@property (nonatomic, strong) UICollectionView* collectionView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.collectionView = [[UICollectionView alloc]init];
    [self.collectionView registerClass:[CollectionCell class] forCellWithReuseIdentifier:@"cell"];
    UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
    flowLayout.itemSize = CGSizeMake(100, 100);
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    [self.collectionView setCollectionViewLayout:flowLayout];

    self.collectionView.frame = CGRectMake(0, 60, 320, 500);
    self.collectionView.backgroundColor = [UIColor whiteColor];
    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;
    [self.view addSubview:self.eventCollection];
}

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

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 20;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CollectionCell* cell = [self.eventCollection dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.label.text = [NSString stringWithFormat:@"%d", indexPath.item];
    return cell;
}
48
kusumoto_teruya

Le crash vous dit assez explicitement ce qui ne va pas:

UICollectionView doit être initialisé avec un paramètre de disposition non nul.

Si vous consultez la documentation de UICollectionView , vous constaterez que le seul initialiseur est initWithFrame:collectionViewLayout:. De plus, dans les paramètres de cet initialiseur, vous verrez:

Cadre

Le rectangle de cadre pour la vue de collection, mesuré en points. L'origine du cadre est relative à la vue dans laquelle vous envisagez de l'ajouter. Cette trame est transmise à la super-classe lors de l'initialisation.

disposition

Objet de présentation à utiliser pour organiser les éléments. La vue de collection stocke une forte référence à l'objet spécifié. Ne doit pas être nul.

J'ai mis en gras la partie importante. Vous devez utiliser initWithFrame:collectionViewLayout: pour initialiser votre UICollectionView et lui transmettre un objet non-nil UICollectionViewLayout


Une façon de résoudre ce problème serait alors de changer simplement l'ordre d'initialisation que vous faites:

UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.itemSize = CGSizeMake(100, 100);
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:flowLayout];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

Notez que dans l'exemple ci-dessus, j'ai supposé que vous souhaitiez utiliser self.view.frame comme image de self.collectionView. Si ce n'est pas le cas, insérez le cadre de votre choix.

64
ravron

Juste une version rapide de Riley Avron 's answer

    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSizeMake(100, 100)
    let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout)
    self.view.addSubview(collectionView)
    collectionView.delegate   = self
    collectionView.dataSource = self
    collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellIdentifier")
17
William Hu

En rapide

var collectionView: UICollectionView!
let layout = UICollectionViewFlowLayout()
collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
layout.scrollDirection = .vertical
view.addSubview(collectionView)
0
Sourabh Kumbhar

ne pas mettre setCollectionViewLayout aimé ceci:

0
Semyon