UICollectionView: debe inicializarse con un parámetro de diseño no nulo

UICollectionView por código.
Ahora, la aplicación falla con el mensaje: UICollectionView must be initialized with a non-nil layout parameter .
¿Tienes alguna idea para arreglarlo?
CollectionCell es una clase personalizada 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; } 

El accidente te dice bastante explícitamente lo que está pasando mal:

UICollectionView debe inicializarse con un parámetro de diseño no nulo.

Si revisa la documentación de Apple para UICollectionView , encontrará que el único inicializador es initWithFrame:collectionViewLayout: Además, en los parámetros para ese inicializador, verá:

marco

El rectángulo del cuadro para la vista de colección, medido en puntos. El origen del marco es relativo a la supervista en la que planea agregarlo. Este marco se pasa a la superclase durante la inicialización.

diseño

El objeto de diseño que se utilizará para organizar elementos. La vista de colección almacena una referencia fuerte al objeto especificado. No debe ser nulo.

He marcado la parte importante. Debe usar initWithFrame:collectionViewLayout: para inicializar su UICollectionView , y debe pasarle un objeto UICollectionViewLayout no nulo.


Una manera de solucionar esto, entonces, sería simplemente cambiar el orden de inicialización que hace:

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

Tenga en cuenta que en el ejemplo anterior, he supuesto que desea usar self.view.frame como el marco de self.collectionView . Si ese no es el caso, inserte el marco que desee en su lugar.

Swift 3.0 y Swift 4.0

UICollectionView

La aplicación se bloqueó tan pronto como se inició cuando se inicializó UICollectionView

inicializar como a continuación (arriba viewDidLoad )

 let alarmCollectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init()) let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() 

En Método (dentro de viewDidLoad )

 layout.scrollDirection = UICollectionViewScrollDirection.vertical alarmCollectionView.setCollectionViewLayout(layout, animated: true) alarmCollectionView.delegate = self alarmCollectionView.dataSource = self alarmCollectionView.backgroundColor = UIColor.clear self.addSubview(alarmCollectionView) 

Funcionó bien después de inicializar de esta manera, estoy usando Autolayout para usar CGRect.zero o usar tu propio CGRect

UICollectionViewController

En caso de que esté utilizando UICollectionViewController lugar de UICollectionView , debe agregar el diseño cuando se inicialice

  let testNavController:UINavigationController = UINavigationController.init() let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init() let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout ) testNavController.pushViewController(collectionView, animated: true) 

Solo una versión rápida de la respuesta de Riley Avron

  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") 

do not setCollectionViewLayout le gusta esto: [self.collectionView setCollectionViewLayout: flowLayout]; intente configurar cuando init: [[UICollectionView alloc] initWithFrame: frame collectionViewLayout: defaultLayout];