gpt4 book ai didi

ios - 单元格中有多个按钮,可将选定的按钮设置为单元格数据

转载 作者:行者123 更新时间:2023-11-29 05:19:46 26 4
gpt4 key购买 nike

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

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

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

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

我想要的是在 CartVC 单元格中显示所选 optionBtn 的价格和重量(选择时),我如何才能修改我在 func 中为 optionBtns 设置的代码

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
}

更新:

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

最佳答案

您可以在闭包中传回值。

因此,在您的 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
}

现在,在 CartViewControllerCartCell 中,您可以填写如下标签:

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

}

关于ios - 单元格中有多个按钮,可将选定的按钮设置为单元格数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58795552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com