可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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... }