Dravidian
Dravidian

Reputation: 9945

How to instantiate a ViewController from a didSelectItemAtIndexPath of a custom CollectionViewController which is a part of a tableViewCell

I want to instantiate a ViewController from a custom tableViewCell(conforming to UICollectionViewDelegate, UICollectionDatasource) class which has a custom CollectionView embedded in it.The segue needs to be performed when a particular section of the CollectionView is selected. Already tried using protocols doesnt work!

my custom TableView class :-
   import UIKit


protocol transferDelegate{

func transfer(_: Int)

}


class ParentTableViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource{



@IBOutlet weak var parentCellHeader: UIView!

@IBOutlet weak var feedPostUsername: UILabel!

@IBOutlet weak var feedPostUserDetails: UILabel!

@IBOutlet weak var feedPostDescription: UILabel!

@IBOutlet weak var feedPicturesCollectionView: UICollectionView!

@IBOutlet weak var feedUserProfilePictures: CustomProfilepicture!



var transferingDelegate : transferDelegate?

override func awakeFromNib() {


    super.awakeFromNib()

    feedPicturesCollectionView.dataSource = self
    feedPicturesCollectionView.delegate = self
    feedPicturesCollectionView.pagingEnabled = true
    feedPicturesCollectionView.backgroundColor = UIColor.clearColor()

}




override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

}




required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

}




func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {

    return 1

}

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

    return 10

}

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

    let cell = feedPicturesCollectionView.dequeueReusableCellWithReuseIdentifier("FeedPicturesCell", forIndexPath: indexPath) as! FeedPhotosCell



    switch(indexPath.row){

    case 0 :   cell.feedImages.image = UIImage(named: "defaultProfilePic")

    case 1 :   cell.feedImages.image = UIImage(named: "image1")

    case 2 :   cell.feedImages.image = UIImage(named: "image2")

    case 3 :   cell.feedImages.image = UIImage(named: "image3")


    default : cell.feedImages.image = UIImage(named: "defaultProfilePic")

        }

        return cell


}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    print(indexPath.row)

    transferingDelegate?.transfer(indexPath.row)


}


}

my viewController class : -

import UIKit

class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource,transferDelegate{

var xibName : String = "HomepageFeedCellHeader"


var lords : [String] = ["name1","name2","name3"]

var que : [String] = ["--","red","blue"]

var desc : [String] = ["abcE","defn","ghi"]

var  menProfilePictures : [UIImage] = [UIImage(named: "image1")!,UIImage(named: "image2")!,UIImage(named: "image3")!]

@IBOutlet weak var parentTableView: UITableView!


var a : ParentTableViewCell = ParentTableViewCell()






override func viewDidLoad() {

    super.viewDidLoad()



    parentTableView.delegate = self
    parentTableView.dataSource = self

    // Do any additional setup after loading the view, typically from a nib.
}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return lords.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = parentTableView.dequeueReusableCellWithIdentifier("ParentCell", forIndexPath: indexPath) as! ParentTableViewCell
    a.transferingDelegate = self
    cell.feedPostUsername.text = lords[indexPath.row]
    cell.feedPostUserDetails.text = queens[indexPath.row]
    cell.feedPostDescription.text = desc[indexPath.row]
    cell.feedUserProfilePictures.image = menProfilePictures[indexPath.row]

    return cell
}

func transfer(itemNo : Int) {

    print("call recieved in viewController from item \(itemNo)")

}



}

Upvotes: 0

Views: 75

Answers (1)

Nirav D
Nirav D

Reputation: 72410

Your didSelectItemAtIndexPath problem is solved. This is the answer of your second issue that you are mention in comment. You can not assign the image the imageView, if it is not in the navigation hierarchy. Your problem is that you detailImage is nil because this ViewController is not loaded in the window hierarchy. To solve your problem just do like this

imagePopOverScene?.selImage =  menProfilePictures[itemNo]

Now declare selImage in your imagePopOverScene like this

var selImage: UIImage!

Also add follwing line in your viewDidLoad of imagePopOverSceneVC

self.detailImage.image = self.selImage

This will solve your problem

Upvotes: 2

Related Questions