Search code examples
iosswifttableviewsegue

Pass data from prototype cell using button inside table cell


I have data that is populating prototype cells dynamically. It will only create as many data cells as required. The issue I am having is passing the data to the detail view when the UIButton is clicked.

Inside each dynamic cell there is a UIButton that when pressed will pass whatever data is inside the cell that is selected into the detail view.

I have no problem loading the data into the table view, I simply cannot pass the values over properly.

Here is my cell for row at:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "part", for: indexPath) as! partsTableCell

    let part = partList[0]

    cell.a.text = String(part.a)
    cell.b.text = part.b
    cell.c.text = part.c
    cell.d.text = part.d
    cell.e.text = part.e
    cell.f.text = part.f

    self.tableView.rowHeight = 250
    cell.layer.borderColor = UIColor.darkGray.cgColor
    cell.layer.borderWidth = 1
    cell.layer.cornerRadius = 5
    cell.clipsToBounds = true
  //tried using tags, but no luck
    //cell.myButton.tag = indexPath.row

    return cell
}

For sake of being thorough I have set up a custom class for the table cell.

class partsTableCell: UITableViewCell {
    @IBOutlet weak var a: UILabel!
    @IBOutlet weak var b: UILabel!
    @IBOutlet weak var c: UILabel!
    @IBOutlet weak var d: UILabel!
    @IBOutlet weak var e: UILabel!
    @IBOutlet weak var f: UILabel!
    @IBOutlet weak var myButton: UIButton!
}

And here is where I am passing the data over:

    func prepare(for segue: UIStoryboardSegue, sender: UIButton) {


        if (segue.identifier == "partDetail") {
            let detailVC = segue.destination as? PartsVCDetail
            let indexPath = self.tableView.indexPathForSelectedRow
            let part = dataList[indexPath.row]
            detailVC?.a = part.a!
            detailVC?.b = part.b!
            detailVC?.c = part.c!
            detailVC?.d = part.d!
            detailVC?.e = part.e!
            detailVC?.f = part.f

        }
}

Everything complies ok, but when I click the button and the segue is performed. The data comes out blank or nil on the other side.

Am I missing something obvious?

Any help would be great!

Thank you

EDIT--

This is how I have set up my detail VC

@IBOutlet weak var qq: UILabel!
@IBOutlet weak var ww: UILabel!
@IBOutlet weak var ee: UILabel!
@IBOutlet weak var rr: UILabel!
@IBOutlet weak var tt: UILabel!
@IBOutlet weak var yy: UILabel!
@IBOutlet weak var uu: UILabel!

var a: Int64!
var b: String = ""
var c: String = ""
var d: String = ""
var e: String = ""
var f: String = ""
var g: String = ""


override func viewDidLoad() {
    super.viewDidLoad()
    //lineNumber.text = "test"

    print(a,"************")
    print(b, "************")
    print(c, "************")
    print(d, "************")
    print(e, "************")
    print(f,"************")
//ALL DATA ABOVE IS EITHER NULL OR EMPTY

    qq.text = a as! String
    ww.text = b
    ee.text = c
    rr.text = d
    tt.text = e
    yy.text = f
    uu.text = g

}

Solution

  • override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "part", for: indexPath) as! partsTableCell
    
    let part = partList[0]
    
    cell.a.text = String(part.a)
    cell.b.text = part.b
    cell.c.text = part.c
    cell.d.text = part.d
    cell.e.text = part.e
    cell.f.text = part.f
    
    self.tableView.rowHeight = 250
    cell.layer.borderColor = UIColor.darkGray.cgColor
    cell.layer.borderWidth = 1
    cell.layer.cornerRadius = 5
    cell.clipsToBounds = true
    
    // give tag to your button and add target
    cell.myButton.tag = indexPath.row
    cell.myButton.addTarget(self, action: #selector(myButtonAction), for: .touchUpInside)
    
    return cell
    

    }

    @objc func myButtonAction(sender:UIButton)  {
    // in button action do your stuff like below
    
    let part = partList[sender.tag]
    
    let detailVC = UIStoryboard(name: "YourStoryBoard", bundle: nil).instantiateViewController(withIdentifier: "partDetail") as! PartsVCDetail
    detailVC?.a = part.a!
    detailVC?.b = part.b!
    detailVC?.c = part.c!
    detailVC?.d = part.d!
    detailVC?.e = part.e!
    detailVC?.f = part.f
    self.navigationController?.pushViewController(detailVC, animated: true)
    

    }