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;
}
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.
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")
En rapide
var collectionView: UICollectionView!
let layout = UICollectionViewFlowLayout()
collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
layout.scrollDirection = .vertical
view.addSubview(collectionView)
ne pas mettre setCollectionViewLayout aimé ceci: