将collectionview委托和数据源从视图控制器中取出

时间:2016-02-12 22:24:55

标签: ios swift uicollectionview

我应该首先说我对swift很新。我试图让我的视图控制器尽可能干净。 我创建了以下类

class AlbumArtist: UICollectionView, UICollectionViewDataSource, UICollectionViewDelegate {
var musicLib = musicLibrary()
var albumCollection: UICollectionView!
var layout: CustomCollectionViewFlow!

init(albumCView: UICollectionView){
    let nib = UINib(nibName: "CollectionViewCell", bundle: nil)
    albumCollection = albumCView

    musicLib.loadAlbums()
    layout = CustomCollectionViewFlow()
    print(layout)
    super.init(frame: albumCollection.frame, collectionViewLayout: layout)
    albumCollection.registerNib(nib, forCellWithReuseIdentifier: "item")
}

required init?(coder: NSCoder) {
    musicLib.loadAlbums()
    layout = CustomCollectionViewFlow()

    super.init(coder: coder)
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return musicLib.getAlbumsCount()
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell: CollectionViewCell = albumCollection.dequeueReusableCellWithReuseIdentifier("item", forIndexPath: indexPath) as! CollectionViewCell

    let objects = musicLib.getAlbums().objectAtIndex(indexPath.item) as! MPMediaItemCollection
    let repObjects = objects.representativeItem

    cell.lbl_Name.text = repObjects!.valueForProperty(MPMediaItemPropertyAlbumTitle) as? String

    let artwork = repObjects!.valueForProperty(MPMediaItemPropertyArtwork)

    let artworkImage = artwork?.imageWithSize(CGSize(width: 230, height: 230))

    if(artworkImage != nil){
        cell.img_artwork.image = artworkImage
    }
    else{
        cell.img_artwork.image = UIImage(named: "no_Artwork.png")
    }


    return cell
}

}

但是我的init方法出错了。必须调用超类&UUCollectionView'

的指定初始值设定项

我不确定我做的是否正确我无法找到有关如何执行此操作的任何示例。因此,如果我完全错了,我很乐意听取我需要做的事情。

编辑:我更新了我的代码并且它现在正在运行。但是它永远不会出现在委托方法中,因此集合视图永远不会被填充。我用新代码更新了帖子中的代码。 在我的viewController中,我在viewDidLoad

中调用上面的类
AlbumArtist(albumCView: AlbumCollectionView)

我不确定我所做的是否正确

2 个答案:

答案 0 :(得分:1)

您尝试从UICollectionView类继承,它根本没有任何问题,但有几种方法可以创建UICollectionView而不从类UICollectionView继承:

  • 您可以使用Interface Builder在@IBOutlet内为UICollectionView创建UIViewController
  • 创建UICollectionViewController以使用Interface Builder管理所有内容
  • UIContainerView内创建UIViewController以放入UICollectionViewController

我希望这对你有所帮助。

答案 1 :(得分:0)

Apple将指定的初始值设定义定义为"类的主要初始值设定项。指定的初始化程序完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续超类链的初始化过程。"

基本上用于UICollectionView,而不是仅调用     super.init() 哪个不是指定的初始化程序,你应该打电话     super.init(frame:CGRect,collectionViewLayout:UICollectionViewLayout)