Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView with Custom Cell Breaking UICollectionViewDataSource Protocol

I am trying to use a UICollectionView with a custom cell. My ViewController inherits from UICollectionViewDataSource as below:

import UIKit
import Parse

class DressingRoomViewController:   UIViewController,
                                    UICollectionViewDelegateFlowLayout,
                                    UICollectionViewDataSource {

That inheritance is causing me to break a protocol of UICollectionViewDataSource with my UICollectionView function that creates and returns the custom cell. This is the function:

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
    }

So before compilation the error is shown in the IDE. How do I get around this error? Here are the two errors I am experiencing:

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

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

Here is the whole 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
    }
}

EDIT: Here is my CustomCell:

import Foundation
import UIKit

class CustomCell: UICollectionViewCell {
    var imageView = MMImageView()

    func setImageV(IV: MMImageView) {
        self.imageView = IV
    }
}
like image 603
BeniaminoBaggins Avatar asked Mar 10 '26 11:03

BeniaminoBaggins


1 Answers

Replace this Code

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

Instead of below this :

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

You can return custom cell but you can't change return type of any DataSource or Delegate method.

like image 83
Chetan Prajapati Avatar answered Mar 12 '26 04:03

Chetan Prajapati



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!