提问人:Nus 提问时间:10/31/2023 最后编辑:Nus 更新时间:10/31/2023 访问量:89
如何在 Swift 中根据按钮单击更新文本值 [已关闭]
How to update the text values based on button click in Swift [closed]
问:
我在swiftUI中有购物车应用程序。目前,当我单击“添加到购物车”按钮时,它能够将产品记录添加到视图中。但这就是问题.当我再次单击按钮两次相同的产品记录时,更直接的是重复记录和秒问题是,我也希望更新产品的数量,但我不确定该怎么做请建议我以击球的方式进行。
这是我的列表视图代码。
import SwiftUI
struct ProductListView: View {
var body: some View {
NavigationStack {
VStack {
if viewModel.productLists.count > 0 && !viewModel.refreshing {
List(viewModel.productList, id: \.self) { product in
ProductListViewCell(productData: product)
} .listStyle(.grouped)
}
}
}
.navigationTitle(Text("Product List"))
}
}
}
这是 cell 的代码。
struct ProductListViewCell: View {
let productData: Product
@EnvironmentObject var order: Order
var body: some View {
HStack {
if let url = URL(string: productData.thumbnail) {
ProductAsyncImageView(url: url)
.frame(width: 150, height: 150)
.mask(RoundedRectangle(cornerRadius: 16))
}
VStack(alignment: .leading,spacing: 5) {
Text("Name: " + (productData.title))
.frame(maxWidth: .infinity, alignment: .leading)
.font(.headline)
Text("Description: " + (productData.description))
.frame(maxWidth: .infinity, alignment: .leading)
.multilineTextAlignment(.leading)
Text("Price: £" + String(productData.price))
.frame(maxWidth: .infinity, alignment: .leading)
.font(.subheadline)
Button {
order.add(item: productData)
} label: {
HStack {
Image(systemName: "cart.badge.plus")
Text("Add to Cart")
.fontWeight(.semibold)
}
.foregroundColor(.white)
.frame(width: 150 , height: 40)
}
.background(Color(.systemBlue))
.cornerRadius(10)
}
}
}
}
这是我的订单类..
import SwiftUI
class Order: ObservableObject {
@Published var product = [Product]()
func add(item: Product) {
product.append(item)
}
func remove(item: Product) {
if let index = product.firstIndex(of: item) {
product.remove(at: index)
}
}
}
这是订单查看的代码。
struct OrderView: View {
@EnvironmentObject var order: Order
var body: some View {
NavigationStack {
List {
Section {
ForEach(order.product) { item in
HStack(spacing: 20) {
if let url = URL(string: item.thumbnail) {
ProductAsyncImageView(url: url)
.frame(width: 90, height: 90)
.padding(.bottom, -10)
.clipShape(Circle())
}
VStack(alignment: .leading) {
Text("Name: \(item.title)")
Text("Price :£\(item.price)")
Button("Show details") {
}.foregroundColor(.gray)
}
HStack {
Image(systemName: "multiply")
Text("1")
}
}
}
}
Section {
NavigationLink("Place Order") {
}
}
}
.navigationTitle("Order")
}
}
}
这是产品列表视图的屏幕截图。
这是我单击“添加到”按钮三次时具有重复记录的屏幕截图,但我只想要数量为 3 的单个记录。
答:
1赞
Pierre Janineh
10/31/2023
#1
在课堂上,你应该有一个变量。
Product
quantity
您应该检查数组中是否存在,并增加其 ,如下所示:
Order.add(item:)
Product
products
quantity
class Order: ObservableObject {
@Published var products = [Product]()
func add(item: Product) {
var exists = false
products.forEach { product in
if product.id == item.id {
exists = true
product.quantity += 1
}
}
if !exists {
product.append(item)
}
}
//The rest of your code...
}
- 最后,您需要显示 in ,如下所示:
quantity
OrderView
...
HStack {
Image(systemName: "multiply")
Text(item.quantity)
}
...
修复了课堂上的错别字:
Order
product:[Product]
->products:[Product]
评论
Order
order.add()