【问题标题】:Having multiple buttons in cell that pass selected buttons set data to cell在单元格中有多个将选定按钮设置数据传递给单元格的按钮
【发布时间】:2020-03-05 02:39:45
【问题描述】:

我的单元格中有三个带有价格和重量标签的按钮,我想做的是让选定的 optionBtn 将重量和价格数据传递给 CartVC

我目前在 CartCell 中的代码尚未发布所选 optionBtn 的重量和价格标签的数据

我在 CartCell 中设置的函数 func configure 用于在 CartVC 的单元格中呈现数据

当按下 atcBtn 将数据传递给 CartVC 时,购物车会显示名称、类别和图像

我想要的是显示Cartvc细胞中所选的选项BBTN价格和重量(选择时)我将如何修改我为Func中为选项所设置的代码进行修改

import UIKit
import SDWebImage
import Firebase

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
    }
    @IBAction func atcBtn(_ sender: UIButton) {
        self.addActionHandler?()
    }   
}

import UIKit
import Firebase
import FirebaseFirestore

class ViewController: UITableViewController {

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

    var itemSetup: [Items] = []

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    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: "Cell") as? Cell else { return UITableViewCell() }

        let item = itemSetup[indexPath.row]
        cell.configure(withItem: item)
        cell.addActionHandler = {
             Cart.currentCart.items.append(item)
        }
        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 = 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
    }

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

        // optionBtns I dont know how to set the code to where I can individual
        //  select a btn to pass the data to the cell
        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)"

        }

       // or this

       switch lastSelectedButton {
    case selctedBtn!.optionBtn1:
        isSelected = true
        lblSubTotal.text = "$\(formatter.string(for: items.price1)!)"
        lblWeight.text = "\(items.weight1)"
    case selctedBtn!.optionBtn2:
        isSelected = true
        lblSubTotal.text = "$\(formatter.string(for: items.price2)!)"
        lblWeight.text = "\(items.weight2)"
    case selctedBtn!.optionBtn3:
        isSelected = true
        lblSubTotal.text = "$\(formatter.string(for: items.price3)!)"
        lblWeight.text = "\(items.weight3)"
    default:
        break
    }
    }  

 // still running tests to make this work just can't seem to have the selected buttons data pass to the Cart Cells
}

更新:

刚刚添加了一些我一直在测试的代码,在选择选项按钮后如何将标签传递到购物车方面仍然没有运气

【问题讨论】:

    标签: ios swift uitableview if-statement uibutton


    【解决方案1】:

    你可以在闭包中传回值。

    因此,在您的 Cell 课程中(命名令人难以讨论 - 使其类似于 SelectItemCell),您可以将您的闭包变量更改为:

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

    这很尴尬,而且可能您将跟踪实际值,但出于示例目的,这将起作用。

    现在,在您持有该表的 VC 中,cellForRowAt,而不是您当前的:

        cell.addActionHandler = {
             Cart.currentCart.items.append(item)
        }
    

    这样分配闭包:

        cell.addActionHandler = { (option: Int) in
            print("Option selected = \(option)")
            // do something based on the option that was selected
            // maybe item.selectedOption = option
            Cart.currentCart.items.append(item)
        }
    

    如果要传回多个值,添加参数:

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

    在您的按钮操作中:

    self.addActionHandler?(priceVal, weightVal)
    

    你的闭包变成:

        cell.addActionHandler = { (price: Int, weight: Int) in
            // use price and weight vars
            // ...
        }
    

    编辑

    如果您的Items 类还没有.selectedOption 属性,您应该添加一个(Int 类型)。您可以使用它来跟踪用户的选择。

    按照以下方式更改您的 cellForRowAt 函数:

    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]
    
        // pass item to cell to configure labels / buttons / etc
        cell.configure(withItem: item)
    
        // when the "add to cart" button in the cell is tapped
        cell.addActionHandler = { (option: Int) in
    
        // option will be 1, 2 or 3, indicating which button the user tapped
        print("Option selected = \(option)")
    
            // update the .selected property of your data
            item.selectedOption = option
    
            Cart.currentCart.items.append(item)
        }
    
        return cell
    }
    

    现在,在 CartViewController 中的 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)"
    
        }
    

    【讨论】:

    • 我刚刚运行了您答案前半部分的代码,我似乎无法弄清楚如何传递重量和价格(重量标签是字符串值,价格标签是它们的 Items Class 中的整数值),因为我试图通过 optionBtns 为 CartVC 价格和重量提供多个值,该选项通过 1,2 或 3 来表示价格和重量,具体取决于所选按钮中的一个
    • @Evelyn - 你有你的Items 对象的属性来保存当前选择的“选项”吗?如:你有.price1.price2.price3.weight1.weight2.weight3...对应选中的“选项”按钮1、2或3...所以你也有@ 987654346@房产?
    • 不,我的 Items 类中没有 selectedOption 属性,但我只是将其放入,代码现在可以使用。你的问题是什么意思?你能帮我分解一下 Gumby 风格吗?我学得有点慢,哈哈
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 2022-12-30
    • 2017-06-14
    • 2017-12-11
    • 2020-03-03
    • 2016-08-29
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多