Search code examples
swiftuitableviewseguexib

Passing a variable from a customCell.xib's button to another UIViewController


My custom cell has a button that when clicked, the user can be taken to another ViewControler. That button has a titleLabel with the String of a user id. What I want to do is take the user to a new UIViewController, passing that clicked buttons's titleLabel (user id) to a variable on the new View Controller. That way, I can use that variable (user id) get further information from firebase and display it on the UI View controller.

on the .xib of the custom cell, I print the UID to make sure each button prints with the correspondent ID, which it does. I can't figure out a way to pass that ID to a new ViewController.

I tried researching online and I found out you can't do prepare(for segue) or performsegue(WithIdentifier) on a customCell.xib.

I tried doing delegates and then protocols but still couldn't get it to work. I am new with Swift. Any help would be great, thank you!

This is the customCell.Xib's Swift file:

class CustomCellTableViewCell: UITableViewCell {

@IBOutlet weak var postImage: UIImageView!
@IBOutlet weak var nameLbl: UILabel!
@IBOutlet weak var descriptionLbl: UITextView!
@IBOutlet weak var profileImageBtn: UIButton!
@IBOutlet weak var profileImage: UIImageView!

@IBOutlet weak var view: UIView!

var btnSelected : Bool = false
var vcInstance: ProfilesTableVC?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    view.clipsToBounds = true
    view.layer.cornerRadius = view.frame.size.width / 2
    profileImage.layer.cornerRadius = profileImage.frame.size.width / 2
    descriptionLbl.alpha = 0.7
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)


}



@IBAction func profileBtnPressed(_ sender: Any) {
    let passValue = UserProfileVC()
    let profileTvC = ProfilesTableVC()
    print (profileImageBtn.titleLabel!.text!)
    var id = (profileImageBtn.titleLabel!.text!)

    profileTvC.didSelectProfileBtn(senderID: id)

}

This is the tableViewController, where I everything gets loaded (not where I want to pass the value). I tried passing the value here and then do a prepareForSegue to pass the value to the new UIViewController but the value becomes nil after the segue happens. I am just including code where the .xib call the function from the table view.

class ProfilesTableVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate,UINavigationControllerDelegate,  UIImagePickerControllerDelegate{

let cell = CustomCellTableViewCell()
func didSelectProfileBtn(senderID: String) {

    senderIDArray.append(senderID)
    var index = senderIDArray.count - 1
    selectedCellUserID = senderIDArray[index]
    performSegue(withIdentifier: "showSendersProfile", sender: Any?.self)


}

This is the UIViewController where I want to pass the variable and display further information from Firebase using that ID

import UIKit
import Firebase

class UserProfileVC: UIViewController  {

    let customCell = CustomCellTableViewCell()
    let profileTvC = ProfilesTableVC()

    @IBOutlet weak var profileImage: UIImageView!
    @IBOutlet weak var nameLbl: UILabel!

    var delegate : Any?

    var getName = String()
    var getsenderID = String()

    let userDataRef = Database.database().reference().child("Users")

    override func viewDidLoad() {
        super.viewDidLoad()
        print("ID is: \(profileTvC.selectedCellUserID)")
        let sender = getsenderID
        print(sender)
    }
}

Solution

  • If you don't want to use protocols, you can addTarget to the button in the tableView - cellForRowAt method, also in that method you set the tag to the row index value.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let profileCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! MoviewReviewCell
        reviewCell.profileImageBtn.tag = indexPath.row
        reviewCell.profileImageBtn.addTarget(self, action: #selector(tappedOnXibCellButton), for: .touchUpInside)
        return reviewCell
    }
    
    @objc func tappedOnXibCellButton(sender: UIButton) {
        print(sender.tag)
        performSegue(withIdentifier: reviewListToDetails, sender: sender.tag)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let identifier = segue.identifier
        if identifier == "segueName" {
            let destViewController = segue.destination as! DestinationClassViewController
            let selectedIndex = sender as! Int
            let profileId = profilesList[selectedIndex].id
            destViewController.profileId = profileId
        }
    }