swift 更改每个产品的数量

vzgqcmou  于 2023-04-19  发布在  Swift
关注(0)|答案(1)|浏览(90)

我不能增加每个产品的计数器,每次我点击+它也会改变所有其他产品的计数器,我该如何修复它?我必须保留共享数据,因为我有另外两个可以修改的视图,必须显示计数器!
我附上的图像与所有的数量相等,即使我只改变了一个
enter image description here

struct Product: Identifiable,Hashable {
    var id = UUID().uuidString
    var categoria: ProductType
    var codice: String
    var descrizione: String = ""
    var prezzo: String
    var immagine: String = ""
}
class SharedDataModel: ObservableObject {
    
    @Published var cartProducts: [Product] = []
    @Published var counterQ: Int = 0

    func addToCart(product: Product) {
        if !cartProducts.contains(where: {$0.id == product.id}) {
            cartProducts.append(product)
        }
        counterQ += 1
    }
    
    func removeToCart(product: Product) {
        if !cartProducts.contains(where: {$0.id == product.id}) {
            cartProducts.append(product)
        }
        counterQ -= 1
    }
struct ProductCardView: View{
    
    @Binding var product: Product
    @EnvironmentObject var sharedData: SharedDataModel
    
    var body: some View{

                Button (action: {
                    sharedData.removeToCart(product: product)
                } , label: {
                    Image(systemName: "minus")
                        .frame(width: 25, height: 30)
                        .foregroundColor(.black)
                })
                Text("\(sharedData.counterQ)")
                    .frame(width: 25, height: 30)
                Button(action: {
                    sharedData.addToCart(product: product)
                } , label: {
                    Image(systemName: "plus")
                        .frame(width: 25, height: 30)
                        .foregroundColor(.black)
                })
    }
}

我不能隔离每个产品的柜台,到现在我已经尝试了一切,我需要你的帮助,非常感谢!!!

b4lqfgs4

b4lqfgs41#

您有一个计数器的共享属性,这意味着它对每个产品都是相同的。您应该做的是:
1.从SharedDataModel中删除counterQ并将其添加到Product
1.编辑计数器时,请使用刚添加的计数器:

func addToCart(product: Product) {
    if let index = cartProducts.firstIndex(of: product) {//make Product conform to Equatable
        cartProducts[index].counter += 1
    }else {
        cartProducts.append(product)
    }
}

func removeFromCart(product: Product) {
    guard let index = cartProducts.firstIndex(of: product) else {return}
    if cartProducts[index].counter > 1 {
        cartProducts[index] -= 1
    }else {
        cartProducts.remote(at: index)
    }
}

1.您从购物车中删除的逻辑是错误的,如果没有找到产品,它将添加产品。在上面的代码中更新了它。
1.您需要在视图中使用该属性:

Text("\(product.counter)")
    .frame(width: 25, height: 30)

相关问题