ios Swift 商品未添加到购物车

2023-12-31

当我点击下面的“添加”按钮时,产品不会添加到购物车,并且结帐 (0) 不会增加到结帐 (1) 等。我做错了什么?

-- 阅读@Larme 的第一条评论后,原始问题得到解决。这是一个菜鸟错误(我忘记将 cell.delegate = self 放入 tableView(_ tableView:, cellForRowAt: in ProductViewController) 中。现在,我在 CartViewController 中遇到了其他问题(请参阅编辑)--

发布相关代码 -

结构产品 -

import UIKit

 struct Product:Equatable {
let name : String
var quantity : Int
var price : Double
let imagename: UIImage
 // var subTotal : Double {
   //return Double(quantity) * price }
}

var products = [Product(name: "a", quantity: 5, price: 5.0,imagename:#imageLiteral(resourceName: "PeasImge")),
                Product(name: "b", quantity: 10, price: 10.0, imagename:#imageLiteral(resourceName: "CakeImage")),]

产品视图控制器类 -

import UIKit

class ProductViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    fileprivate var cart = Cart()

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self    }

        override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        //Workaround to avoid the fadout the right bar button item
        self.navigationItem.rightBarButtonItem?.isEnabled = false
        self.navigationItem.rightBarButtonItem?.isEnabled = true

        //Update cart if some items quantity is equal to 0 and reload the product table and right button bar item

        cart.updateCart()
        self.navigationItem.rightBarButtonItem?.title = "Checkout (\(cart.items.count))"
        tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    /*   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showCart" {
            if let cartViewController = segue.destination as? CartViewController {
                cartViewController.cart = self.cart
            }
        }
    }*/

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return products.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell   {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProductTableViewCell") as!   ProductTableViewCell



        let product = products[indexPath.item] 
       cell.delegate = self // original issue was here, now resolved.
       cell.name?.text = product.name
        cell.imageView?.image =  product.imagename
        cell.setButton(state: self.cart.contains(product: product))
        // Configure YourCustomCell using the outlets that you've defined.

        return cell
    }
}

extension ProductViewController: CartDelegate {

    // MARK: - CartDelegate
    func updateCart(cell: ProductTableViewCell) {
        guard let indexPath = tableView.indexPath(for: cell) else { return }
        let product = products[indexPath.item]

        //Update Cart with product
        cart.updateCart(with: product)
        self.navigationItem.rightBarButtonItem?.title = "Checkout (\(cart.items.count))"
    }
}

类产品TableViewCell-

import UIKit
  
protocol CartDelegate {
    func updateCart(cell: ProductTableViewCell)
}

class ProductTableViewCell: UITableViewCell {
    weak var myParent:ProductViewController?
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var price: UILabel!
    @IBOutlet weak var imagename: UIImageView!

    @IBOutlet weak var addToCartButton: UIButton!




    var delegate: CartDelegate?

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

        addToCartButton.layer.cornerRadius = 5
        addToCartButton.clipsToBounds = true
    }

    func setButton(state: Bool) {
        addToCartButton.isSelected = state
        addToCartButton.backgroundColor = (!addToCartButton.isSelected) ? .black : .red
    }

    @IBAction func addToCart(_ sender: Any) {
        setButton(state: !addToCartButton.isSelected)
        self.delegate?.updateCart(cell: self)
    }
}

购物车项目类

进口基金会

 class CartItem {
 var quantity : Int = 1
 var product : Product
/*  var subTotal : Float { get { return Float(product.price) *     Float(quantity) } } */
 init(product: Product) {
    self.product = product
  }
}

类购物车 -

  import Foundation

 class Cart {
  var items : [CartItem] = []
  }

extension Cart {


 /* var total: Float {
    get { return items.reduce(0.0) { value, item in
        value + item.subTotal
        }
    }
 }*/

var totalQuantity : Int {
    get { return items.reduce(0) { value, item in
        value + item.quantity
        }
    }
}
func updateCart(with product: Product) {
    if !self.contains(product: product) {
        self.add(product: product)
    } else {
        self.remove(product: product)
    }
}
func updateCart() {
    
    for item in self.items {
        if item.quantity == 0 {
            updateCart(with: item.product)
        }
      }
    }

func add(product: Product) {
    let item = items.filter { $0.product == product }
    
    if item.first != nil {
        item.first!.quantity += 1
      } else {
        items.append(CartItem(product: product))
     }
   }

  func remove(product: Product) {
    guard let index = items.firstIndex(where: { $0.product == product }) else { return}
    items.remove(at: index)
}
func contains(product: Product) -> Bool {
    let item = items.filter { $0.product == product }
    return item.first != nil
 }

}

如果您愿意,我还可以发布“CartItemTableViewCell”和“CartViewController”。

任何帮助将不胜感激。

编辑:感谢@Larme,最初的问题现已解决。

我有另一个问题,在阅读@Larme 的第一条评论后,我粘贴了“CartViewController”和“CartItemTableViewCell”以及旧代码中的一些修正。

问题出在 CartViewController 中 - 当我在加载购物车后单击“结账”按钮时,它在 CartviewController 的“tableView(_ tableView: UITableView, numberOfRowsInSection”中显示错误 - 请参阅下面的 CartVieController 代码:-

类 CartViewController

 import UIKit

class CartViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var totalView: UIView!
@IBOutlet weak var totalLabel: UILabel!

var cart: Cart? = nil
fileprivate let reuseIdentifier = "CartItemCell"
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView(frame: .zero)
   }
 }

extension CartViewController: UITableViewDelegate, UITableViewDataSource {
// MARK: - Table view data source
func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
   return (cart?.items.count)!// Error - Thread 1:EXC_BAD_INSTRUCTION..
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! CartItemTableViewCell
    
   if let cartItem = cart?.items[indexPath.item] {
        cell.delegate = self as CartItemDelegate
        
        cell.nameLabel.text = cartItem.product.name
     //   cell.priceLabel.text = cartItem.product.price
        cell.quantityLabel.text = String(describing: cartItem.quantity)
        
        
        
       cell.quantity = cartItem.quantity
        // cell.contentView.backgroundColor = !cell.decrementButton.isEnabled ? .white : .blue
    }
    return cell
        }
      }

 extension CartViewController: CartItemDelegate {

// MARK: - CartItemDelegate
func updateCartItem(cell: CartItemTableViewCell, quantity: Int) {
    guard let indexPath = tableView.indexPath(for: cell) else { return      }
    guard let cartItem = cart?.items[indexPath.row] else { return }
    
    //Update cart item quantity
    cartItem.quantity = quantity
    
    //Update displayed cart total
 //   guard let total = cart?.total else { return }
    
    //totalLabel.text = String(total)
    //   print(total)
    }
  }

类 CartItem TableViewCell -

import UIKit

 protocol CartItemDelegate {
func updateCartItem(cell: CartItemTableViewCell, quantity: Int)
}

class CartItemTableViewCell: UITableViewCell {

@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var priceLabel: UILabel!

@IBOutlet weak var incrementButton: UIButton!
@IBOutlet weak var decrementButton: UIButton!
@IBOutlet weak var quantityLabel: UILabel!

var delegate: CartItemDelegate?
var quantity: Int = 1

 override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    
    incrementButton.layer.cornerRadius = 10
    incrementButton.clipsToBounds = true
    
    decrementButton.layer.cornerRadius = 10
    decrementButton.clipsToBounds = true
  }

 override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
 }

   @IBAction func updateCartItemQuantity(_ sender: Any) {
    if (sender as! UIButton).tag == 0 {
        quantity = quantity + 1
    } else if quantity > 0 {
        quantity = quantity - 1
    }
    
    decrementButton.isEnabled = quantity > 0
    decrementButton.backgroundColor = !decrementButton.isEnabled ? .gray : .black
    
    self.quantityLabel.text = String(describing: quantity)
    self.delegate?.updateCartItem(cell: self, quantity: quantity)
  }
}






  

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios Swift 商品未添加到购物车 的相关文章

随机推荐