我有一个列表,其中包含从 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
}
}