В моем классе UICollectionView объявлен как
@IBOutlet слабый var artworkCollectionView: UICollectionView!
Внутри этого класса есть один метод делегата, вызываемый двумя другими контроллерами представления, один из этих VC является всплывающим, а другой - обычным VC.
Метод делегата получает некоторые данные из базы данных, а затем обновляет представление коллекции, вызывая внутри замыкания:
self.artworkCollectionView.reloadData ()
Когда метод делегата вызывается из всплывающего VC, все отлично работает. НО, когда метод делегата вызывается обычным VC, когда он попадает в self.artworkCollectionView.reloadData (), он получает печально известную фатальную ошибку: неожиданно найден ноль при неявном развертывании необязательного значения.
Я проверил все ссылки на ячейку reuseIdentifier, и все правильно. Я подозреваю, что, поскольку UICollectionView объявлен как слабый var, когда я перехожу из текущего класса во всплывающее окно, а затем всплывающее окно вызывает методы делегата, ссылка не теряется, но когда я перехожу из текущего класса в обычный VC, а затем обычный VC вызывает метод делегата, ссылка на мою слабую переменную теряется, и поэтому он «рассматривается» как ноль.
@IBOutlet weak var artworkCollectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
// Set up
artworkCollectionView.dataSource = self
artworkCollectionView.delegate = self
artworkCollectionView.isUserInteractionEnabled = true
artworkCollectionView.allowsSelection = true
artworkCollectionView.register(UINib(nibName:
"MyCollectionViewCell", bundle: nil),
forCellWithReuseIdentifier: "cell")
}
// delegate method
func reloadCollections() {
retrieveAlbumRatings { (isAlbum) in
if isAlbum {
self.retrieveAlbumData(completion: { (isFinished) in
if isFinished {
// Reload collection views
self.artworkCollectionView.reloadData()
}
})
}
}
}
Если я прав, мой вопрос: как я могу дать слабую переменную artworkCollectionView: UICollectionView! СИЛЬНАЯ ссылка, чтобы она не потерялась в потоке от текущего класса к обычному VC и обратно?
РЕДАКТИРОВАТЬ: вот что я пытался до сих пор:
Удалите «слабое» из объявления розетки, сделав его так: @IBOutlet var artworkCollectionView: UICollectionView!
Но я получил ту же ошибку
Я передал artworkCollectionView в обычный виртуальный канал через override executeSegue, а затем передал его обратно в качестве аргумента метода делегата. Это не дает мне фатальной ошибки, но также не перезагружает UICollectionView, потому что я думаю, что в любом случае слабая ссылка на выход UICollectionView потеряна.
Спасибо за вашу помощь (отказ от ответственности: я довольно новичок в Swift ..)