我不能增加每一个产品的计数器,每次我点击+它改变了所有其他的计数器,我怎么能解决它?我必须保留共享数据,因为我有另外两个可以修改且必须显示计数器的视图!
我将所有数量相等的图像附加在一起即使我只改变了一个
输入图片描述
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)
})
}
}
我无法隔离每个产品的柜台,目前我已经尝试了所有我需要你的帮助,非常感谢!!
您有一个计数器的共享属性,这意味着它对每个产品都是相同的。你应该做的是:
-
从
SharedDataModel
中移除counterQ
&添加到Product
-
当您编辑计数器时,使用您刚刚添加的计数器:
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) } }
-
您从购物车中删除的逻辑是错误的,如果没有找到,它会添加产品。在上面的代码中更新。
-
你需要在你的视图中使用这个属性:
Text("(product.counter)") .frame(width: 25, height: 30)