Evelyn
Evelyn

Reputation: 186

How to pass data on button clicked in cell to another tableview?

First: How would I be able to pass data from the ItemVC Cell to the CartVC on button Clicked (Add To Cart Button(ATC)) in the selected cell, since I am no trying to use didSelectRowAt to pass the data to the CartVC. but the ATC btn to pass the cells data to the CartVC

my Segue from the ItemVC to the CartVC is in the BarButtonItem(cartBtn) so I dont want to jump to the CartVc when pressing the ATC button but only pass selected items data to CartVC when the ATC is pressed

Second how would I be able to pass the increment/decrement value in lblQty to to the CartVC when the ATC is pressed as well to be able to present a more accurate Subtotal

enter image description here

import UIKit
import SDWebImage
import Firebase


class ItemCell: UITableViewCell {

    weak var items: Items!

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var category: UILabel!
    @IBOutlet weak var productImage: UIImageView!
    @IBOutlet weak var weight: UILabel!
    @IBOutlet weak var price: UILabel!

    @IBOutlet weak var lblQty: UILabel!

    @IBOutlet weak var addToCart: RoundButton!
    @IBOutlet weak var plusBtn: RoundButton!
    @IBOutlet weak var minusBtn: RoundButton!

    func configure(withItems : Items) {
        name.text = product.name
        category.text = items.category
        image.sd_setImage(with: URL(string: items.image))
        price.text = items.price
        weight.text = items.weight
    }

}

import UIKit
import Firebase
import FirebaseFirestore

class ItemViewController: UITableViewController {

    @IBOutlet weak var cartBtn: BarButtonItem!!
    @IBOutlet weak var tableView: UITableView!

    var itemSetup: [Items] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self

        fetchItems { (items) in
            self.itemSetup = items.sorted
            self.tableView.reloadData()
        }

    }
    func fetchItems(_ completion: @escaping ([Items]) -> Void) {
       // -** FireStore Code **-
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as? CartViewController {
            vc.items = self.itemSetup
        }
    }
    @objc func plusItem(_ sender: UIButton) {
        // -** increase Qty Code **-
    }

    //Function to decrement item count
    @objc func minusItem(_ sender: UIButton) {
      //  -** decrease Qty Code **-
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return itemSetup.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell") as? ItemCell else { return UITableViewCell() }

        cell.configure(withItem: itemSetup[indexPath.row])

        cell.lblQty.text = "\(self.imageSetup[indexPath.row].count)"
        cell.plusBtn.tag = indexPath.row
        cell.plusBtn.addTarget(self, action: #selector(self.plusItem(_:)), for: .touchUpInside)
        cell.minusBtn.tag = indexPath.row
        cell.minusBtn.addTarget(self, action: #selector(self.minusItem(_:)), for: .touchUpInside)

        return cell
    }

}

class CartViewController: UIViewController {

    var items: Items!
    @IBOutlet weak var cartTableView: UITableView!

     override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        cartTableView.dataSource = self
        cartTableView.delegate = self
    }

}

extension CartViewController: UITableViewDataSource, UITableViewDelegate {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Cart.currentCart.cartItems.count
    }

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

        let cart = Cart.currentCart.CartItems[indexPath.row]
        cell.qty.text = "\(cart.qty)"
        cell.lblMealName.text = "\(cart.items.category): \(cart.items.name)"
        cell.lblSubTotal.text = "$\(cart.items.price1 * Float(cart.qty))"

        cell.imageUrl                             // can't figure out how to pass image

        return cell
    }
}

import Foundation

class CartItem {

    var items: Items
    var qty: Int

    init(items: Items, qty: Int) {
        self.items = items
        self.qty = qty
    }
}

class Cart {
    static let currentCart = Cart()
    var cartItems = [CartItem]()
}

Upvotes: 2

Views: 1414

Answers (1)

Gaximus
Gaximus

Reputation: 46

Just create a protocol to create a delegate and assign it to your cart class when the cell is initialized

protocol ItemCellDelegate {
    func itemCell(didTapButton button: UIButton)
}    

Then have a delegate property in the ItemCell

class ItemCell {
    weak var delegate: ItemCellDelegate?
    ...
    // Then call the delegate method when the buttons is tapped.
    func buttonTapped() {
        delegate?.itemCell(didTapButton: theCellsButton)
    }
}

Then make your Cart conform to the delegate

extension Cart: ItemCellDelegate {
    func itemCell(didTapButton button: UIButton) {
        // Do you stuff with button, or any other data you want to pass in
    }
}

Then set the delegate before the cell is returned.

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

    let cart = Cart.currentCart.CartItems[indexPath.row]
    cell.qty.text = "\(cart.qty)"
    cell.lblMealName.text = "\(cart.items.category): \(cart.items.name)"
    cell.lblSubTotal.text = "$\(cart.items.price1 * Float(cart.qty))"

    cell.delegate = Cart.currentCart //You should rename this static var to just 'current'

    return cell
}

Upvotes: 2

Related Questions