繁体   English   中英

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

[英]how to pass data from one Tableview to another Tableview when button is pressed in cell?

我试图将数据从 ViewController 传递到我的 CartViewController。 ViewController 中的单元格有 3 个按钮(optionBtns),每个按钮的价格和重量为 label。

我想要做的是让选项 Btn 被选中,一旦按下 ATC 按钮,就会传递上面的 label 数据

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

当按下 ATC 以在单元格中显示选定的项目名称、图像和类别时,我如何能够将选定的数据传递给 CartVC,其中包含选定的 optionBtn 数据(价格和重量)

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

在此处输入图像描述

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]()
}

如果想法是让 firebase 处理您的所有数据,那么数据应该 go 到 firebase 而不是通过 viewController。 即您的 Firebase 数据库应该有一个items集合(或者每个store可能一个),并且您的user应该有一个cart集合。 当用户点击添加到购物车按钮时,您将有问题的项目添加到 firebase 中的用户购物车集合中,然后显示 cartViewController。 cartViewController 应该订阅当前用户的cart集合,然后从该 firebase 集合中填充其 tableview。

TLDR the typical design of a firebase app is that the firebase DB is the source of truth for the app, so you should write all changes to firebase and then simply observe these collections elsewhere in the app. 这也确保了如果用户在另一台设备上编辑购物车,它将在 iOS 设备上使用新的购物车项目进行自我更新。

您可以在闭包中传递值。

因此,在您的 Cell class 中,您可以将您的闭包变量更改为:

 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)

}

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

修改 Cell 中的 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)"

    }

1-添加代表

 guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? Cell else { return UITableViewCell() } 
 cell.delegate = self

2- 在单元格内创建 var

weak var delegate:ViewController?

3-在按钮动作中使用它

switch senderButton {
    case optionBtn1:
        self.delegate?.senddata(items.category ,name:items.name,weight:items.weight1,price:items.price1)

依此类推,然后在ViewController中创建senddata function 并从那里到 CartVC

您可以像 CartData 一样创建CartData并拥有将它们传递给 CartViewController 所需的所有属性。 在您的情况下,这将是图像、名称、类别、价格和重量。

sendData方法中,从您传递给该方法的参数创建此CartData实例,并将其分配给例如局部变量cartDataToSend 然后使用performSegueWithIdentifier方法来 segue 到 CardViewController。

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

这就是您可以将数据传递到新视图 controller 的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM