Неизвестна причина ошибки unexpectedly found nil while unwrapping an Optional value

collectionview
swift

#1

Доброго времени суток всем!

Кратко ситуация:
есть два CollectionView. В них должны отображаться изображения + подпись, но в примере добавляется только изображение.

Проблема - в одном контроллере всё отображается отлично, в другом аналогичные действия приводят к ошибке fatal error: unexpectedly found nil while unwrapping an Optional value Что обозначает ошибка - я знаю. Но вот причину обнаружить не получается.

Попытки определить причину ошибки результата не дали, потому (как к крайнему средству) обращаюсь к вам: в чем причина ошибки? Что делать в будущем, чтобы избежать подобных ситуаций?

Ниже собственно исходники:

КОНТРОЛЛЕР, ГДЕ ВСЁ РАБОТАЕТ (использован UICollectionViewController)

import UIKit

private let reuseIdentifier = "Cell"

class AddArticleCollectionViewController: UICollectionViewController {

var images = [UIImage]()

func imagesSet() -> [UIImage] {
    var img: UIImage?
    var result = [UIImage]()
    img = UIImage(named: "apple")!
    for _ in 1 ... 10 {
        result.append(img!)
    }
    
    return result
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    images = imagesSet()
    self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


override func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of items
    return images.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCollectionViewCell
    
    for img in images {
        cell.imageIcon.image = img            
    }    
    return cell
}
}

Класс ячейки CollectionViewCell с двумя аутлетами:

import UIKit

class MyCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imageIcon: UIImageView!

@IBOutlet weak var Label: UILabel!    
}

КОНТРОЛЛЕР, ГДЕ ВЫСКАКИВАЕТ ОШИБКА ВРЕМЕНИ ИСПОЛНЕНИЯ (CollectionView встроен в ViewController):

import UIKit

class MainViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    
var images = [UIImage]()

func imagesSet() -> [UIImage] {
    var img: UIImage?
    var result = [UIImage]()
    img = UIImage(named: "apple")!
    for _ in 1 ... 10 {
        result.append(img!)
    }
    
    return result
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    images = imagesSet()    
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    
}


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


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
    return images.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCollectionViewCell
          
    for img in images {
        cell.imageIcon.image = img
    }
    return cell
}
}

#2

В классе ячейки прописал вот так:

import UIKit

class MyCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imageIcon: UIImageView

@IBOutlet weak var Label: UILabel    
}

После этого ошибка исчезла и приложение запускается. Только в CollectionView отображаются прототипы ячеек, а изображение не подтягивается. Укажите направление, где что исправить?


#3

Вопрос в том как подтягиваете изображение и как отрисовываете саму ячейку.


#4

Изображение (в тестовом варианте) подтягивается из одномерного массива изображений одного типа (в рабочем варианте будут подтягиваться из CoreData). Массив формируется при вызове ViewDidLoad. Проверял, массив действительно создается и заполняется изображениями из assets.

В самом CollectionView в сториборде подготовил макет ячейки (добавил ImageView и Label). Соответственно, подготовил класс ячейки, где вывел аутлеты ImageView и Label.

Заполнение CollectionView сделано стандартно, через cellForItem, с указанием на пользовательский класс ячеек.

Собственно, на этапе кодинга ошибок xcode не выдает. Проблемы при выполнении только.

Что-то упустил?


#5

По тексту вроде ничего не упустили, но нужен код.


#6

class MainViewController
смотритет в етот клас - он наследуется от вьюКонтролера и + делегати = но ссилки от колекшн вью по коду у вас не видно ( короче ви разним подходам создали два контролера но код идентичний - потому по 1 работает а по 2 неработает ) … ну и еще как вариант Ви могли не протягнуть делегат -датасорс на сториборде чтоб контролеру дать права


#7

Благодарю!!! Проверю и отпишусь о результатах…


#8

Спасибо большое!

Проблема решилась!

Что было - у меня был класс MyCollectionViewCell, который я создавал для другого CollectionView. В нем были выведены аутлеты именно с того, другого CollectionView. А потом, когда я создал этот, “проблемный” CV, я просто указал старый класс MyCollectionViewCell, но не сделал связи в сториборде.

Как в итоге решилось - создал новые аутлеты в сториборде для “проблемного” CollectionView - и всё заработало!!!

Спасибо за помощь!