2014-11-14 6 views
0

Я новичок в быстром и не могу понять, как решить эту ошибку.Быстрая фатальная ошибка: неожиданно найден nil при развертывании Необязательное значение

Я создаю представление коллекции, и это мой код:

import UIKit 

class FlashViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 

    @IBOutlet weak var collectionView: UICollectionView! 

     override func viewDidLoad() { 
     super.viewDidLoad() 
     // Move on ... 
     let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
     layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10) 
     layout.itemSize = CGSize(width: 90, height: 90) 
     collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
     self.collectionView.dataSource = self 
     self.collectionView.delegate = self 
     collectionView.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell") 
     collectionView.backgroundColor = UIColor.whiteColor() 
     self.view.addSubview(collectionView!) 
    } 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 20 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as CollectionViewCell 
     cell.backgroundColor = UIColor.blackColor() 
     cell.textLabel?.text = "\(indexPath.section):\(indexPath.row)" 
     cell.imageView?.image = UIImage(named: "circle") 
     return cell 
    } 
} 

каждый раз, когда я запускаю его self.collectionView.dataSource = self линии подсвечивается, и я получаю вышеуказанную ошибку.

+0

Кажется, что '' self.collectionView' является nil'. Убедитесь, что ваши розетки IB установлены правильно. Используете ли вы раскадровки или файл .xib? – Kirsteins

+0

Свойства IBOutlet должны быть установлены в Interface Builder и редко из кода, поэтому убедитесь, что вы хотите установить это в viewDidLoad. –

ответ

4

Как вы используете слабую ссылку, ваш коллекционный вид выпущен до того, как вы его назовете.

Для этого вам нужно сделать так, чтобы удалить ключевое слово "weak".

@IBOutlet var collectionView: UICollectionView! 

Или заставьте его остаться в памяти по-другому.

+0

Огромное спасибо! – Seynin97

+0

Это сработало и для меня. Я следовал учебнику и застрял в этой части. Интересно, какая разница, потому что она работает в образце проекта ... – MXV

0
... 

collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 

// because collectionView is a weak variable, it will be released here 
self.collectionView.dataSource = self // error, collectionView is nil 

... 

Как @ сказал Vitaliy1, вы можете сделать collectionView сильную ссылку или использовать локальный переменные дыры, прежде чем добавить его в иерархию представлений.

... 

let collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
collectionView.dataSource = self 

... 

view.addSubview(collectionView) 
// view establishes a strong reference to collectionView, 
// so you can reference it until it is removed from the view hierarchy. 
self.collectionView = collectionView 

или, почему бы не использовать подкласс UICollectionViewController

Смежные вопросы

 Смежные вопросы