UICollectionViewController Error in Swift 3.0: must be initialized with a non-nil layout parameter

13,243

Solution 1

Thank you! I incorporated your suggestions. Below is the code that works:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    let cellId = "CellId"
    var colView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let layout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
        layout.itemSize = CGSize(width: 111, height: 111)
        
        colView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
        colView.delegate   = self
        colView.dataSource = self
        colView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
        colView.backgroundColor = UIColor.white
        
        self.view.addSubview(colView)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 21
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath as IndexPath)
        cell.backgroundColor = UIColor.orange
        return cell
    }
}

Again, thank you guys very much. Have an awesome day :D

Solution 2

This should work:

lazy var collectionView: UICollectionView = {
     let layout = UICollectionViewFlowLayout()
     let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
     return collectionView
}()

Solution 3

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let cellSize = CGSize(width: 90, height: 120)
    //
    return CGSizeMake(cellSize)
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {

    return UIEdgeInsetsMake(top: 20, left: 10, bottom: 10, right: 10)
}
Share:
13,243
TravelingAries
Author by

TravelingAries

Updated on June 30, 2022

Comments

  • TravelingAries
    TravelingAries almost 2 years

    I'm new to iOS development. I've been learning Swift, and today, I tried using UICollectionViewController.

    My code is as follows:

     class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
        var colView: UICollectionView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
            layout.itemSize = CGSize(width: 90, height: 120)
    
            colView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
            colView.dataSource = self
            colView.delegate = self
            colView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
            colView.backgroundColor = UIColor.white
            self.view.addSubview(colView)
        }
    
        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 14
        }
    
        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath as IndexPath)
            cell.backgroundColor = UIColor.orange
            return cell
        }
    
    
    }
    

    However, when I try to run it, I get the following error:

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter'
    

    I have looked up previous posts discussing this issue, but I couldn't find anything that fixed my code.

    How should I fix this?