带有自定义单元格的 UICollectionView 破坏 UICollectionViewDataSource 协议

UICollectionView with Custom Cell Breaking UICollectionViewDataSource Protocol

我正在尝试将 UICollectionView 与自定义单元格一起使用。我的 ViewController 继承自 UICollectionViewDataSource 如下:

import UIKit
import Parse

class DressingRoomViewController:   UIViewController,
                                    UICollectionViewDelegateFlowLayout,
                                    UICollectionViewDataSource {

这种继承导致我使用创建和 returns 自定义单元格的 UICollectionView 函数破坏了 UICollectionViewDataSource 的协议。这是函数:

func collectionView(collectionView: UICollectionView,
        cellForItemAtIndexPath indexPath: NSIndexPath)
        -> CustomCell {
            let cell = collectionView.dequeueReusableCellWithReuseIdentifier(
                identifier,forIndexPath:indexPath) as! CustomCell
            let dressingRoomIcons: [DressingRoomIcon] =
            dataSource.dressingRoomIcons
            let dressingRoomIcon = dressingRoomIcons[indexPath.row]
            var imageView: MMImageView =
            createIconImageView(dressingRoomIcon.name!)

            cell.setImageV(imageView)
            return cell
    }

所以在编译之前错误显示在IDE中。我该如何解决这个错误?这是我遇到的两个错误:

Type 'DressingRoomViewController' does not conform to protocol 'UICollectionViewDataSource'

Cannot assign a value of type 'DressingRoomViewController' to a value of type 'UICollectionViewDataSource?'

这是全部ViewController:

import UIKit
import Parse

class DressingRoomViewController:   UIViewController,
                                    UICollectionViewDelegateFlowLayout,
                                    UICollectionViewDataSource {

    @IBOutlet weak var MirrorImageView: UIImageView!
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var heightConstraint: NSLayoutConstraint!
    let identifier = "cellIdentifier"
    let dataSource = DataSource()
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    let cellSpacing: CGFloat = 5
    let cellsPerRow: CGFloat = 6
    let numberOfItems = 12

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.dataSource = self
    }

    override func viewDidAppear(animated: Bool) {
        let cellSize = (collectionView.collectionViewLayout
            .collectionViewContentSize().width
            / cellsPerRow)
            - (cellSpacing)

        layout.itemSize = CGSize(width: cellSize, height: cellSize)
        layout.minimumInteritemSpacing = cellSpacing
        layout.minimumLineSpacing = cellSpacing
        layout.scrollDirection = UICollectionViewScrollDirection.Horizontal
        collectionView.collectionViewLayout = layout
        self.heightConstraint.constant = cellSize
        self.view.layoutIfNeeded()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func prepareForSegue(  segue: UIStoryboardSegue,
                                    sender: AnyObject?) {
        if (segue.identifier == "dressingRoom2MyOutfits") {
            let myOutfitsViewController = segue.destinationViewController
                as! MyOutfitsViewController
        } else if (segue.identifier == "dressingRoom2StickerPicker") {
            let myStickerPickerController = segue.destinationViewController
                as! StickerPickerViewController
        }
    }

    func imageTapped(sender: UITapGestureRecognizer) {
        var imageView = sender.view as! MMImageView
        println(imageView.fname)
        performSegueWithIdentifier( "dressingRoom2StickerPicker",
                                    sender: imageView)
    }
}

// MARK:- UICollectionViewDataSource Delegate
extension DressingRoomViewController : UICollectionViewDataSource {

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

    func collectionView(collectionView: UICollectionView,
        numberOfItemsInSection section: Int) -> Int {
            return 12
    }

    func collectionView(collectionView: UICollectionView,
        cellForItemAtIndexPath indexPath: NSIndexPath)
        -> CustomCell {
            let cell = collectionView.dequeueReusableCellWithReuseIdentifier(
                identifier,forIndexPath:indexPath) as! CustomCell
            let dressingRoomIcons: [DressingRoomIcon] =
            dataSource.dressingRoomIcons
            let dressingRoomIcon = dressingRoomIcons[indexPath.row]
            var imageView: MMImageView =
            createIconImageView(dressingRoomIcon.name!)

            cell.setImageV(imageView)
            return cell
    }

    func createIconImageView(name: String) -> MMImageView{
        var imageView :MMImageView =
            MMImageView(frame:CGRectMake(   0,
                                            0,
            (collectionView.collectionViewLayout
                .collectionViewContentSize().width / cellsPerRow)
                - (cellSpacing),
            (collectionView.collectionViewLayout
                .collectionViewContentSize().width / cellsPerRow)
                - (cellSpacing)))
        imageView.contentMode = UIViewContentMode.ScaleAspectFit
        imageView.image = UIImage(named: name)
        imageView.setName(name)
        imageView.backgroundColor = UIColor.clearColor()
        imageView.userInteractionEnabled = true
        var tapGestureRecognizer =
        UITapGestureRecognizer(target: self, action: "imageTapped:")
        tapGestureRecognizer.numberOfTapsRequired = 1
        imageView.addGestureRecognizer(tapGestureRecognizer)
        return imageView
    }
}

编辑:这是我的 CustomCell:

import Foundation
import UIKit

class CustomCell: UICollectionViewCell {
    var imageView = MMImageView()

    func setImageV(IV: MMImageView) {
        self.imageView = IV
    }
}

替换此代码

func collectionView(collectionView: UICollectionView,
        cellForItemAtIndexPath indexPath: NSIndexPath)
        -> UICollectionViewCell {

而不是下面这个:

func collectionView(collectionView: UICollectionView,
        cellForItemAtIndexPath indexPath: NSIndexPath)
        -> CustomCell {

您可以return自定义单元格,但不能更改return任何数据源或委托方法的类型。