代码之家  ›  专栏  ›  技术社区  ›  Lyndon Abesamis

如何在为我的购物车视图SWIFTUI追加时仅显示唯一的项目

  •  0
  • Lyndon Abesamis  · 技术社区  · 3 年前

    这是我的密码。 我正在制作收银机IPAD

    我们看到的是: 当我用相同的项目名称点击该项目两次时,它会添加另一个项目 而是划船

    我期待的是: 我的期望是,它只添加一行项目及其数量计数器

    希望有人能帮我。我已经无法找到样本或任何信息来指导我想要实现的目标。谢谢大家

    Screenshot on iPad

    import Foundation
    import SwiftUI
    
    class OrderViewModel: ObservableObject {
    
       @Published var orderItems = [Cart]()
       @State var count: Int = 1
       
       func AddToCart(item: item){
             orderItems.append(
                Cart(product_name: item.product_name, price:item.price, quantity: quantity )
            )
        }
    }
    
    
      struct Cart: Identifiable{
        
       var id = UUID()
       var product_name: String
        var price: String
        var quantity: Int
    }
    

    这是我的cartView,它将从OrderViewModel类打印所有@EnvironmentObject

    import SwiftUI
    
    struct CartContainer: View {
        
        @EnvironmentObject var order: OrderViewModel
        var body: some View{
            ZStack{
                 Color("lightGrayColor")
                .ignoresSafeArea()
                VStack(alignment: .leading) {
                    VStack{
                        HStack{
                            Text("Item Name")
                                .font(Font.system(size: 16, weight: .light))
                                .frame(width:200)
                            Spacer()
                            Text("Qty.").font(Font.system(size: 16, weight: .light))
                                .padding(.leading, -78)
                            Spacer()
                            Text("Subtotal.").font(Font.system(size: 16, weight: .light))
                                .padding(.leading, -78)
                        }
                    }
                    .padding(.top, 10)
                    ScrollView{
                        VStack(alignment: .leading){
                            ForEach(order.orderItems, id:\.id){ list in
                                HStack{
                                     Text(list.product_name)
                                             .font(Font.system(size: 16, weight: .light))
                                             .frame(width:200)
                                         Spacer()
                                     Text(list.price).font(Font.system(size: 16, weight: .light))
                                             .padding(.leading, -78)
                                         Spacer()
                                    Text("\(list.quantity)").font(Font.system(size: 16, weight: .light))
                                             .padding(.leading, -78)
                               }
                                .padding(.top, 10)
                        }
                        }.padding()
                    }.padding()
                    Text("Grand Total :")
                        .font(Font.system(size: 30, weight: .bold))
                        .padding(.bottom, 30)
                        .padding(.leading, 40)
                    Button(action: {
                    }) {
                                   Text("Charge")
                                    .foregroundColor(.white)
                                    .font(Font.system(size: 30, weight: .bold))
                                    .frame(minWidth: 0, maxWidth: .infinity)
                                    .padding(.top, 35)
                                    .padding(.bottom, 35)
                                    .background(Color("ButtonGreen"))
                    }.padding(.bottom, -10)
                              
                }
            }
            .frame(width: 550)
        }
    }
    
    
    struct CartContainer_Previews: PreviewProvider {
        static var previews: some View {
            CartContainer().environmentObject(OrderViewModel())
      }
    }
    

    这是我从API中取出的产品列表

    import SwiftUI
    
    
    struct ProductsListContainer: View {
    
        var body: some View{
            ZStack{
                Color(.white)
                VStack{
                    ProductList()
                }
            }
            .frame(maxWidth: .infinity)
        }
    }
    
    struct ProductList: View{
       
        var body: some View{
            VStack {
                SearchItem()
                ItemListHeader()
                ShowItemList()
                .padding(5)
            }
            
        }
    }
    
    struct ItemListHeader: View {
        var body: some View {
            HStack{
                Text("Item Name")
                    .font(Font.system(size: 20, weight: .heavy))
                    .frame(width:300)
                Spacer()
                Text("Price").font(Font.system(size: 20, weight: .heavy))
                    .padding(.leading, -78)
                Spacer()
                Text("Qty.").font(Font.system(size: 20, weight: .heavy))
                    .padding(.leading, -78)
            }
            Divider()            
        }
    }
    
    
    struct ShowItemList: View {
        @StateObject  var itemVM = ProductViewListModel()
        @EnvironmentObject var order:  OrderViewModel
    
        var body: some View {
            ScrollView {
                ForEach(itemVM.item) { dataPoint in
                    ZStack{
                    HStack{
                        Text(dataPoint.product_name)
                            .font(.headline)
                            .frame(width:300)
                        Spacer()
                        Text(dataPoint.price)
                        Spacer()
                        Text("\(dataPoint.quantity)")
                    }
                    .padding()
                    .padding(.leading, -20)
                    .padding(.trailing, 20)
                    .padding(.top, 5)
                    .padding(.bottom, 5)
                }.onTapGesture {
                    self.order.AddToCart(item: dataPoint.product)
                }
                    Divider()
                }
              }
            .padding()
           }
       }
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   workingdog support Ukraine    3 年前

    当你使用“AddToCart(…)”时,你需要检查一下你是否已经有了物品。 尝试类似的方法:

    class OrderViewModel: ObservableObject {
        @Published var orderItems = [Cart]()
        
        // note: comparing product_name, assuming product_name is unique here
        func AddToCart(item: Item) {
            if let ndx = orderItems.firstIndex(where: {$0.product_name == item.product_name}) {
                // already have this cart/item, do an update here
                orderItems[ndx].price = item.price
                orderItems[ndx].quantity = item.quantity
            } else {
                // add a new cart/item
                orderItems.append(Cart(product_name: item.product_name, price:item.price, quantity: item.quantity))
            }
        }
    }
    

    或许可以这样称呼:

    .onTapGesture {
        self.order.AddToCart(item: dataPoint)
     }