«UICollectionView должен быть инициализирован с ненулевым параметром макета» проблема возникает, даже если параметр макета установлен - PullRequest
0 голосов
/ 09 октября 2018

Вы можете видеть из кода ниже, что параметр макета был установлен внутри 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() с первой попытки.Какие еще есть альтернативы?

1 Ответ

0 голосов
/ 09 октября 2018

Как насчет этого?

private lazy var collectionView: UICollectionView = {
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.itemSize = CGSize(width: 188.0, height: 268.0)

    let result: UICollectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    result.register(CellClass.self, forCellWithReuseIdentifier: "cell")
    result.dataSource = self
    result.delegate = self
    return result
}()
...