【问题标题】:'UICollectionView must be initialized with a non-nil layout parameter' problem arises even when layout parameter is set'UICollectionView 必须使用非 nil 布局参数初始化' 问题即使设置了布局参数也会出现
【发布时间】:2018-10-09 19:02:52
【问题描述】:

从下面的代码可以看到ViewDidLoad()里面设置了layout参数,但是报错了:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'UICollectionView 必须是 使用非零布局参数初始化'

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() 内并初始化 viewDidLoad() 内的 dataCollectionViews 时,一切都按预期工作,在选择分段控件的第一个按钮时显示 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() 进行初始化。还有什么其他选择?

【问题讨论】:

    标签: swift uicollectionview swift4


    【解决方案1】:

    这样的事情怎么样?

    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
    }()
    

    【讨论】:

    • 工作就像一个魅力。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多