必须调用超类“UICollectionView”的指定初始化程序

Posted

技术标签:

【中文标题】必须调用超类“UICollectionView”的指定初始化程序【英文标题】:Must call a designated initializer of the superclass 'UICollectionView' 【发布时间】:2017-02-02 10:20:46 【问题描述】:

尝试初始化一个collection view类并得到以下错误:

必须调用超类'UICollectionView'的指定初始化器

数据正在从另一个 ViewController 传递,我希望在用户搜索时从 ViewController 中绘制框架。

class searchLocationsCollectionViewManager: UICollectionView, UICollectionViewDataSource, UICollectionViewDelegate 

weak var collectionView: UICollectionView! 
    didSet 
        collectionView.dataSource = self
        collectionView.delegate = self
    


// Data handler
var data: [[String:Any]]? 
    didSet 
        print(data!)
        //collectionView.reloadData()
    


init(collectionView: UICollectionView, frame: CGRect) 
    self.collectionView = collectionView
    super.init()


required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)!




func numberOfSections(in collectionView: UICollectionView) -> Int 
    return 1


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return 3


// This is the current method for returning the cell.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 




    return UICollectionViewCell()


关于为什么会发生上述情况的任何想法?

【问题讨论】:

UICollectionView 子类中的 UICollectionView 属性的用途是什么?考虑分配初始值时未调用didSet。如果您的意思是UICollectionViewController,那么已经有一个UICollectionView 属性。 【参考方案1】:

你需要调用UICollectionView的指定初始化器init(frame:collectionViewLayout:)

init(collectionView: UICollectionView, frame: CGRect)         
    self.collectionView = collectionView
    //Setup collectionView layout here and pass with init 
    let layout = UICollectionViewLayout()
    super.init(frame: frame, collectionViewLayout: layout)

【讨论】:

我的类是从 UICollectionView 扩展的,它没有 collectionView 属性说:'MyCollectionView' 类型的值没有成员'collectionView' 为什么这只适用于 UICollectionViewController? 为什么UICollectionView没有collectionView @Daniella 因为UICollectionView 没有collectionView 属性,您需要创建扩展UICollectionViewMyCollectionView 的对象。

以上是关于必须调用超类“UICollectionView”的指定初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

Swift:“必须调用超类的指定初始化程序”错误,即使代码正在这样做

覆盖 UICollectionView 的 UIPanGestureRecognizer

UICollectionView 错误:必须通过调用来检索单元格 -: -dequeueReusableCellWithReuseIdentifier:forIndexPath:

未调用 UICollectionView cellForItem

在Python 3中,超类可以多态地调用子类的构造函数

JavaSE复习_3 继承