我正在尝试将数据从ViewController传递到我的CartViewController。 ViewController中的单元格具有3个按钮(optionBtns),每个按钮上方都有一个价格和重量标签。
我想做的是,一旦按下ATC按钮,选择的optionBtn就会通过其上方的标签数据
单元格中的ATC按钮将图像,名称,类别和optionBtn数据传递到CartViewController单元格(CartCell)
当按下ATC键以选中的选项在Btn数据(价格和重量)中显示所选项目的名称,图像和类别时,如何将所选数据传递到CartVC?
我还使用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]()
}
答案 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:)
。
这就是将数据传递到新的视图控制器的方式。