当单元格中按下按钮时,如何将数据从一个Tableview传递到另一个Tableview?

时间:2019-10-30 23:36:33

标签: ios swift uitableview google-cloud-firestore segue

我正在尝试将数据从ViewController传递到我的CartViewController。 ViewController中的单元格具有3个按钮(optionBtns),每个按钮上方都有一个价格和重量标签。

我想做的是,一旦按下ATC按钮,选择的optionBtn就会通过其上方的标签数据

单元格中的ATC按钮将图像,名称,类别和optionBtn数据传递到CartViewController单元格(CartCell)

当按下ATC键以选中的选项在Btn数据(价格和重量)中显示所选项目的名称,图像和类别时,如何将所选数据传递到CartVC?

我还使用Cloud Firestore发布数据以填充VC单元

enter image description here

class Cell: UITableViewCell {

    weak var items: Items!    
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var category: UILabel!
    @IBOutlet weak var productImage: UIImageView!

    @IBOutlet weak var weightOne: UILabel!
    @IBOutlet weak var weightTwo: UILabel!
    @IBOutlet weak var weightThree: UILabel!

    @IBOutlet weak var priceOne: UILabel!
    @IBOutlet weak var priceTwo: UILabel!
    @IBOutlet weak var priceThree: UILabel!

    @IBOutlet weak var addToCart: RoundButton!

    @IBOutlet weak var optionBtn1: RoundButton!
    @IBOutlet weak var optionBtn2: RoundButton!
    @IBOutlet weak var optionBtn3: RoundButton!

    var addActionHandler: (() -> Void)?

    func configure(withItems items: Items) {
        name.text = items.name
        category.text = items.category
        image.sd_setImage(with: URL(string: items.image))
        priceOne.text = items.price1
        priceTwo.text = items.price2
        priceThree.text = items.price3
        weightOne.text = items.weight1
        weightTwo.text = items.weight2
        weightThree.text = items.weight3
        self.items = items
    }

    var lastSelectedButton = UIButton()
    @IBAction func cartTypeSelected(_ sender: RoundButton) {
        lastSelectedButton.isSelected = false; do {
            self.lastSelectedButton.backgroundColor = UIColor.blue
        lastSelectedButton = sender 
        sender.isSelected = true; do {
            self.lastSelectedButton.backgroundColor = UIColor.lightGreen
        }
    }
    @IBAction func atcBtn(_ sender: UIButton) {
        self.addActionHandler?()
    }   
}

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 = Tray.currentCart.cartItems[indexPath.row]
        cell.configure(withItems: cart)

        return cell
    }
}

class CartCell: UITableViewCell {

    var selctedBtn: Cell?

    @IBOutlet weak var lblMealName: UILabel!
    @IBOutlet weak var imageUrl: UIImageView!
    @IBOutlet weak var lblSubTotal: UILabel!
    @IBOutlet weak var lblWeight: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    func configure(withItems items: Items) {
        // lblWeight.text = "\(items.weight1)"
        lblMealName.text = "\(items.category): \(items.name)"
        let formatter = NumberFormatter()
        formatter.maximumFractionDigits = 2
        formatter.numberStyle = .decimal
        // lblSubTotal.text = "$\(formatter.string(for: items.price1)!)"
        imageUrl.sd_setImage(with: URL(string: items.imageUrl))

        if selctedBtn?.optionBtn1.isSelected == true {
            lblSubTotal.text = "$\(formatter.string(for: items.price1)!)"
            lblWeight.text = "\(items.weight1)"            

        } else if selctedBtn?.optionBtn2.isSelected == true {
            lblSubTotal.text = "$\(formatter.string(for: items.price2)!)"
            lblWeight.text = "\(items.weight2)"

        } else if selctedBtn?.optionBtn3.isSelected == true {
            lblSubTotal.text = "$\(formatter.string(for: items.price3)!)"
            lblWeight.text = "\(items.weight3)"

        }
    }  
}

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

3 个答案:

答案 0 :(得分:3)

如果您的想法是让Firebase处理您的所有数据,则数据应通过firebase,而不是通过viewController。也就是说,您的Firebase数据库应该具有items集合(或者每个store一个),而您的user应该具有cart集合。当用户点击添加到购物车按钮时,您会将有问题的商品添加到firebase中的该用户购物车集合中,然后显示cartViewController。 cartViewController应该订阅当前用户的cart集合,然后从该Firebase集合填充其表视图。

TLDR firebase应用程序的典型设计是firebase数据库是该应用程序的真实来源,因此您应将所有更改写入firebase,然后在应用程序中的其他位置简单地观察这些集合。这还可以确保,如果用户在其他设备上编辑购物车,它将在iOS设备上使用新的购物车商品进行更新。

答案 1 :(得分:1)

您可以在闭包中传递值。

因此,在Cell类中,您可以将闭包var更改为:

 var addActionHandler: ((Int) -> Void)?

然后,在您的addToCart按钮操作中,遵循以下内容:

@IBAction func atcBtn(_ sender: UIButton) {

    // pass back the user selected values
    var i = 0
    switch lastSelectedButton {
    case optionBtn1:
        i = 1
    case optionBtn2:
    i = 2
    default:
        i = 3
    }
    self.addActionHandler?(i)

}

创建Items类的.selectedOption属性,应添加一个(Int类型)。您可以使用它来跟踪用户的选择。

在单元格中修改cellForAt:

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

    // use var to make item mutable
        var item = itemSetup[indexPath.row]
        cell.configure(withItem: item)
        cell.addActionHandler = { (option: Int) in
        print("Option selected = \(option)")
        item.selectedOption = option

        Cart.currentCart.items.append(item)
    }

    return cell
}

在您的CartCell中,您可以像这样制作标签:

    if items.selectedOption == 1 {
        lblSubTotal.text = "$\(formatter.string(for: items.price1)!)"
        lblWeight.text = "\(items.weight1)"            

    } else if items.selectedOption == 2 {
        lblSubTotal.text = "$\(formatter.string(for: items.price2)!)"
        lblWeight.text = "\(items.weight2)"

    } else if items.selectedOption == 3 {
        lblSubTotal.text = "$\(formatter.string(for: items.price3)!)"
        lblWeight.text = "\(items.weight3)"

    }

答案 2 :(得分:0)

您可以创建类似CartData的类,并具有将它们传递给CartViewController所需的所有属性。您的情况就是图片,名称,类别,价格和重量。

sendData方法中,根据您传入方法的参数创建此CartData实例,然后将其分配给局部变量cartDataToSend。然后使用performSegueWithIdentifier方法选择CardViewController。

当然不要忘记使用覆盖的cartDataToSend方法将CartViewController变量分配给prepare(for segue:)

这就是将数据传递到新的视图控制器的方式。