2016-11-04 3 views
2

Я новичок в разработке iOS. Я изучаю Swift, и сегодня я попытался использовать UICollectionViewController.Ошибка UICollectionViewController в Swift 3.0: должна быть инициализирована с параметром макета no-nil

Мой код выглядит следующим образом:

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 
    } 


} 

Однако, когда я пытаюсь запустить его, я получаю следующее сообщение об ошибке:

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

Я смотрел на предыдущие посты обсуждали этот вопрос, но Я не мог найти ничего, что фиксировало мой код.

Как это исправить?

+0

Вставьте трассировку стека – rounak

ответ

4

Спасибо! Я включил ваши предложения. Ниже приведен код, который работает:

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 
} 

}

Опять же, спасибо вам, ребята, очень много. Удивительный день: D

0

Просто измените порядок, как ниже:

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 
0

Вы можете настроить свой код так:

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... 

} 
1
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) 
} 
Смежные вопросы