如何以编程方式快速创建 uicollectionview(没有情节提要)

Posted

技术标签:

【中文标题】如何以编程方式快速创建 uicollectionview(没有情节提要)【英文标题】:how to create uicollectionview with swift programatically (without storyboard) 【发布时间】:2016-10-08 00:57:11 【问题描述】:

我正在尝试以编程方式快速创建一个 uicollectionview,没有任何情节提要。我需要它是多个uicollectionview。 这是我的代码

class jobtypeViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource
var collectionview1 = UICollectionView()
var collectionview2 = UICollectionView()

override func viewDidLoad() 
    super.viewDidLoad()

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
    layout.itemSize = CGSize(width: 100, height: 100)

    collectionview1 = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    self.collectionview1.delegate = self
    self.collectionview1.dataSource = self
    collectionview1.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    self.view.addSubview(collectionview1)

    collectionview2 = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    self.collectionview2.delegate = self
    self.collectionview2.dataSource = self
    collectionview2.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    self.view.addSubview(collectionview2)

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    if collectionView == self.collectionview1 
        return 5
    else
        return 4
    


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    if collectionView == self.collectionview1 
        let cellA = collectionview1.dequeueReusableCellWithReuseIdentifier("Cell",forIndexPath: indexPath) as UICollectionViewCell
        return cellA
    

    else 
        let cellB = collectionview2.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell
        return cellB
    

一切似乎都很好,我有布局、委托和数据源,但是当我运行它时,我收到此消息错误 Terminating app due to uncaught exception 'NSInvalidArgumentException',原因:'UICollectionView must be initialized with a non-nil layout parameter '。我错过了什么吗??

【问题讨论】:

我忘了补充说我为此创建了一个故事板,但我想用纯编码制作 uicollectionview(故事板中没有 collectionview)。我不知道这是否会有所不同。因为我仍然可以使用段控制实现它 【参考方案1】:

您的初始化程序看起来正确,但是,您的成员变量使用空初始化程序进行初始化,该初始化程序将在触发 viewDidLoad 之前进行评估

 var collectionview1 = UICollectionView()

您可以将其更改为隐式展开,因为您会立即在 viewDidLoad 中初始化这些值

var collectionview1: UICollectionView!

【讨论】:

现在一切都是红色的,哈哈。我从它那里得到错误“预期的成员名称或类型名称后的构造函数调用”。 您确定将属性更改为我提供的语法吗?从错误来看,听起来不像。注意冒号而不是赋值运算符(=) 傻傻的我,它现在没有给我错误,但是当我转到视图控制器时,整个事情都变黑了。 可能有很多原因,将集合视图或集合视图单元格的背景颜色设置为白色或任何您想要的。请注意,您还在另一个集合视图之上添加集合视图,因为它们具有相同的确切框架。是时候调试和学习了,祝你好运!

以上是关于如何以编程方式快速创建 uicollectionview(没有情节提要)的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式快速创建水平 UIScrollView

如何以编程方式快速定位图层?

如何以编程方式快速向 UITableViewCell 内的 UIStackView 添加约束?

如何以编程方式快速添加自定义 UIButton

在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView

以编程方式快速创建对象数组 3