I added UICollectionView
by code.
Now, the app crash with message: UICollectionView must be initialized with a non-nil layout parameter
.
Do
Just a swift version of 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")
The crash is telling you pretty explicitly what is going wrong:
UICollectionView must be initialized with a non-nil layout parameter.
If you check the documentation for UICollectionView, you'll find that the only initializer is initWithFrame:collectionViewLayout:
. Further, in the parameters for that initializer, you'll see:
frame
The frame rectangle for the collection view, measured in points. The origin of the frame is relative to the superview in which you plan to add it. This frame is passed to the superclass during initialization.
layout
The layout object to use for organizing items. The collection view stores a strong reference to the specified object. Must not be nil.
I've bolded the important part. You must use initWithFrame:collectionViewLayout:
to initialize your UICollectionView
, and you must pass it a non-nil UICollectionViewLayout
object.
One way to fix this, then, would be to simply change the order of initialization you do:
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"];
Note that in the above example, I've assumed you want to use self.view.frame
as the frame of self.collectionView
. If that's not the case, insert whatever frame you want instead.
Swift 3.0 and Swift 4.0
UICollectionView
The app crashed as soon as it launched when UICollectionView
is initialised
initialize like below (above viewDidLoad
)
let alarmCollectionView:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
In Method (inside viewDidLoad
)
layout.scrollDirection = UICollectionViewScrollDirection.vertical
alarmCollectionView.setCollectionViewLayout(layout, animated: true)
alarmCollectionView.delegate = self
alarmCollectionView.dataSource = self
alarmCollectionView.backgroundColor = UIColor.clear
self.addSubview(alarmCollectionView)
Worked fine after initialising like this I am using Autolayout so using CGRect.zero
or use your own CGRect
UICollectionViewController
In case if you are using UICollectionViewController
instead of UICollectionView
you need to add layout when initialization
let testNavController:UINavigationController = UINavigationController.init()
let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
let collectionView:UICollectionViewController = UICollectionViewController.init(collectionViewLayout:layout )
testNavController.pushViewController(collectionView, animated: true)
Swift 3.0, Swift 4.0 and Swift 5.0
It's work for me.
let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
In Method (inside viewDidLoad)
if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
flowLayout.scrollDirection = .horizontal
}
In Swift
var collectionView: UICollectionView!
let layout = UICollectionViewFlowLayout()
collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
layout.scrollDirection = .vertical
view.addSubview(collectionView)
don't setCollectionViewLayout liked this:
[self.collectionView setCollectionViewLayout:flowLayout];
try to set when init:
[[UICollectionView alloc] initWithFrame:frame collectionViewLayout:defaultLayout];