Hardik Gondaliya
Hardik Gondaliya

Reputation: 326

Swift 3 pass values to Controller on UICollectionViewCell button click

I am beginner in iOS development and I have implemented following screen using UICollectionView :

enter image description here

CollectionViewCell File Code is:

import UIKit

class EventCell: UICollectionViewCell{

var classEvent: Event?

@IBOutlet weak var eventTitle: UILabel!
@IBOutlet weak var eventTeams: UILabel!
@IBOutlet weak var eventTime: UILabel!
@IBOutlet weak var eventTeamOneImage: UIImageView!
@IBOutlet weak var eventTeamTwoImage: UIImageView!

@IBOutlet weak var leaderboardButton: UIButton!

var datasourceItem: Any?{
    didSet{
        guard let event = datasourceItem as? Event else { return }
        classEvent = event

        eventTitle.text = "Match \(event.matchNo) (\(event.matchStage))"
        eventTeams.text = "\(event.teamOne.nameAttr) vs \(event.teamTwo.nameAttr)"
        eventTime.text = "\(event.getEventLockTimeAsString())"
        eventTeamOneImage.loadImageUsingCache(withUrl: event.teamOne.flagPhoto)
        eventTeamTwoImage.loadImageUsingCache(withUrl: event.teamTwo.flagPhoto)
        leaderboardButton.addTarget(self, action: #selector(handleLeaderBoardClick), for: .touchUpInside)
    }
}

@IBAction func leagueButton(_ sender: Any) {
}

weak var delegate: HomeControllerDelegate?
func handleLeaderBoardClick() {
    if let matchId = classEvent?.id {
        print(matchId)
        delegate?.clickOnLeaderBoard(matchId: matchId)
    }
}   
 }

Now on click on Leaderboard button(icon with 1,2,3) I would like to open new LeaderBoard Controller and pass matchId which is classEvent.id

How can I pass values to the new controller? And what is the best way to do that.

Upvotes: 1

Views: 429

Answers (2)

Y_Y
Y_Y

Reputation: 341

Three easy steps to get what u want:

  1. Make a BaseViewController class a subclass of UiViewController. This class would be the alternate of UiViewcontroller in your project,it means while creating any viewcontroller BaseViewController will be the parent class.

  2. Declare a variable in BaseViewController.e.g- var data: Any?

  3. Then while moving from a viewcontroller to another , simply assign any type of data to that variable declared in BaseViewController. And in any lifecycle method of your new viewcontroller you will get that data using self.data.

Upvotes: -1

Saurabh Jain
Saurabh Jain

Reputation: 1698

You can pass the match Id via segue:

In LeaderBoard Controller set a property:

var matchId:Int?

Set a segue between the controller and add an identifier: On Click leaderboard button:

self.performSegueWithIdentifier("yourSegueIdentifier", sender: self)

Add the segue method:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    if segue,identifier == "yourSegueIdentifier" {
        let destinationVC = segue.destinationViewController as LeaderbardController
        destinationVC.matchId = classEvent.id
        }
}
    }

Upvotes: 2

Related Questions