Вы можете видеть из кода ниже, что параметр макета был установлен внутри ViewDidLoad()
, но он выдает мне ошибку:
Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: 'UICollectionView должен быть инициализирован с параметром макета, отличным от nil '
var layer: UICollectionViewFlowLayout = {
var item = UICollectionViewFlowLayout()
item.itemSize = CGSize(width: 100, height: 100)
return item
}()
UICollectionView
объект был установлен в инициализаторе свойства, потому что, очевидно, я хочу, чтобы этот объект UICollectionView
был доступен глобально:
var dataCollectionViews = UICollectionView()
viewDidLoad(){
dataCollectionViews = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0) , collectionViewLayout: self.layer)
view.addSubview(dataCollectionViews)
self.dataCollectionViews.delegate = self
self.dataCollectionViews.dataSource = self
self.dataCollectionViews.register(UICollectionViewCell.self, forCellWithReuseIdentifier: collectionViewReuse)
self.dataCollectionViews.layer.cornerRadius = 10
self.dataCollectionViews.translatesAutoresizingMaskIntoConstraints = false
self.dataCollectionViews.isHidden = true
changed()
}
Когда я переместил содержимое внутри changed()
внутрь viewDidLoad()
и инициализировал dataCollectionViews внутри viewDidLoad()
, все работало, как предполагалось, показывая объект UICollectionView
при выборе первой кнопки сегментированного элемента управления.
@objc func changed() {
if segmentTime.selectedSegmentIndex == 0 {
self.dataCollectionViews.isHidden = false
let dataCollectionTop = NSLayoutConstraint(item: self.dataCollectionViews, attribute: .top, relatedBy: .equal, toItem: sortLabel, attribute: .bottom, multiplier: 1.0, constant: 10)
let dataCollectionLeft = NSLayoutConstraint(item: self.dataCollectionViews, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 10)
let dataCollectionRight = NSLayoutConstraint(item: self.dataCollectionViews, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1.0, constant: -10)
let dataCollectionHeight = NSLayoutConstraint(item: self.dataCollectionViews, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 520/812, constant: 0)
let dataCollectionWidth = NSLayoutConstraint(item: self.dataCollectionViews, attribute: .width, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 355/375, constant: 0)
NSLayoutConstraint.activate([dataCollectionLeft, dataCollectionRight, dataCollectionHeight, dataCollectionWidth, dataCollectionTop])
}
if segmentTime.selectedSegmentIndex == 1 {
}
if segmentTime.selectedSegmentIndex == 2 {
}
}
Я хотел бы попытаться установить объект dataCollectionViews в инициализаторе свойства, но я знаю, что это невозможно, но кажется, что dataCollectionViews
необходимо инициализировать с UICollectionViewFlowLayout()
с первой попытки.Какие еще есть альтернативы?