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

匿名 (未验证) 提交于 2019-12-03 09:02:45

问题:

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?

回答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



回答2:

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


回答3:

Just change the order like below one :

let layout = 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) self.view.addSubview(colView) colView.delegate   = self colView.dataSource = self colView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell") colView.backgroundColor = UIColor.white 


回答4:

You can set your code like this:

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {      let cellId = "Cell"      lazy var collectionView: UICollectionView = {         let layout = UICollectionViewFlowLayout()         // ... layout parameters         let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)         cv.backgroundColor = .white         cv.delegate = self         cv.dataSource = self         return cv     }()      override func viewDidLoad() {         super.viewDidLoad()          view.addSubview(collectionView)         // ... add your auto layout constraints to the collection view         collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)     }      // Delegate and Data Source Methods...  } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!