我有一个列表,其中包含从firebase数据库中提取的物品.我希望每个项目都有单独的计数器,但有一个变量没有为我做到这一点,而是向列表上的每个项目添加1.图片附于展示.

我拥有的代码:

    @State var quantityItem: Int = 0
    var body: some View {
            List (menumodel.list) { item in
            VStack{
                HStack{
                    VStack {
                        Text(item.id)
                            .frame(maxWidth: .infinity, alignment: .leading)
                        Text("123 kcal, 330ml")
                            .font(.caption)
                            .foregroundStyle(Color.gray)
                            .frame(maxWidth: .infinity, alignment: .leading)
                        
                    }
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .padding(.vertical)
                    HStack{
                        Button {
                            if quantityItem > 0 {
                                self.quantityItem -= 1
                            }
                            
                        }label: {
                            Image(systemName: "minus.circle")
                                .tint(Color.black)
                        }
                        Text("\(quantityItem)")
                        Button {
                            self.quantityItem += 1
                        }label: {
                            Image(systemName: "plus.circle")
                                .tint(Color.black)
                        }
                    }.frame(maxWidth: .infinity, alignment: .trailing)
                        .padding(.all)
                }
            }
        }
        
        .listStyle(GroupedListStyle())
        .buttonStyle(BorderlessButtonStyle())
        
        
}
    }
#Preview {
    DrinksMenuView()
}```

推荐答案

您需要使用字典来计算每个列表上的项目

@State private var quantities: [String: Int] = [:]

更改按钮如下:

 HStack {
                        Button {
                            decrementQuantity(for: item.id)
                        } label: {
                            Image(systemName: "minus.circle")
                                .tint(Color.black)
                        }
                        Text("\(quantities[item.id, default: 0])")
                        Button {
                            incrementQuantity(for: item.id)
                        } label: {
                            Image(systemName: "plus.circle")
                                .tint(Color.black)
                        }
                    }
                    .frame(maxWidth: .infinity, alignment: .trailing)
                    .padding(.all)

然后使用这些:

   private func incrementQuantity(for id: String) {
            quantities[id, default: 0] += 1
        }
    
        private func decrementQuantity(for id: String) {
            if let currentCount = quantities[id], currentCount > 0 {
                quantities[id]! -= 1
            }
        }

Swift相关问答推荐

如何才能在同一线程上调用类中的每个方法,而不对每个调用使用同步块?

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

TimeZone 背后的目的

OSX 中的 Popover 无法确定透明度

RealityKit - 从中心zoom 模型

ConfirmationDialog取消swiftui中的错误

是否有一个带有空初始值设定项的 Swift 类/ struct 的标准协议

确定路径是否相交的有效方法

如何在 SWIFTUI 中旋转修剪?

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

供应和普通数组中具有空值的 map 函数的行为不一致?

Swift 非参与者隔离闭包

P384 公钥获取IncorrectParameterSize

SwiftUI Grid 中的数组旋转

Swift:连接两个数组而不重复共享后缀/前缀

为什么swiftui中的导航视图栏那么大?

如果没有标记,则为 Swift 预处理器

swift 如何从 Int 转换?到字符串

使用 swift 运行 pod install 时出错

如何快速识别字符串中的大写和小写字符?