Я использую list
и ForEach()
. Когда я изменил какие-либо значения из данных массива, список не обновляется.
List{
ForEach(0 ..< (self.getCartDetails?.data?.items!.count)!){ nm in // Getting crashed in nm (Index) after when any item is removed and TotalCount is decreased by 1
if (self.getCartDetails?.data?.items![nm].quantity != "0"){
HStack(alignment: .center){
HStack{
Image(uiImage: self.image[nm]!)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 100, height: 100)
.padding(.horizontal, 1.0)
.background(Color.white)
.overlay(
Rectangle()
.stroke(Color.gray.opacity(0.3), lineWidth: 0.5)
)
.onAppear {
let imgLoader = DataLoader(resourseURL: URL(string: String((self.getCartDetails?.data?.items![nm].productimagelink)!)))
imgLoader.loadImage { (data) in
if data != nil{
guard let imgTemp = UIImage(data:data!) else {
return
}
self.image[nm] = imgTemp
}
}
}
Spacer()
VStack(alignment: .leading, spacing: 5){
Text(verbatim:(self.getCartDetails?.data?.items![nm].productname ?? "")).font(Font.custom(FONT.PoppinsRegular, size: 15.00)).foregroundColor(Color("ThemeBlackColor"))
Text(verbatim:(self.getCartDetails?.data?.items![nm].productname ?? "")).font(Font.custom(FONT.PoppinsRegular, size: 12.00)).foregroundColor(Color("AppTextColor"))
HStack{
Text("\((self.getCartDetails?.data?.items![nm].actualprice ?? 0))").font(Font.custom(FONT.PoppinsRegular, size: 12.00)).foregroundColor(Color("AppTextColor")).overlay(
VStack(alignment: .center){
Divider().frame(height: 1).background(Color.gray)
}
)
Text("\((self.getCartDetails?.data?.items![nm].latestprice ?? 0))").font(Font.custom(FONT.PoppinsRegular, size: 15.00)).foregroundColor(Color("ThemeBlackColor"))
}
VStack{
HStack{
Text(verbatim:(self.getCartDetails?.data?.items![nm].descriptionField ?? "")).font(Font.custom(FONT.PoppinsItalic, size: 12.00))
.foregroundColor(Color("DarkThemeGreen2")).lineLimit(2)
Spacer()
HStack(spacing: 1){
Image("minus").renderingMode(.original)
.frame(width: 25, height: 30)
.contentShape(Rectangle())
.clipped()
.gesture(
TapGesture()
.onEnded { _ in
if Int((self.getCartDetails?.data?.items![nm].quantity)!)! == 1{
self.getCartDetails?.data?.items![nm].quantity = "0"
self.updateMyCart(cartid: (self.getCartDetails?.data?.cartid)!, itemid: ((self.getCartDetails?.data?.items![nm].productid)!), quantity: "0", itemindex: nm)
}else{
var count = Int((self.getCartDetails?.data?.items![nm].quantity)!)!
count -= 1
self.getCartDetails?.data?.items![nm].quantity = "\(count)"
self.updateMyCart(cartid: (self.getCartDetails?.data?.cartid)!, itemid: ((self.getCartDetails?.data?.items![nm].productid)!), quantity: count, itemindex: nm)
}
}
)
Button(action: {
}) {
HStack {
Text("\((self.getCartDetails?.data?.items![nm].quantity)!)").font(Font.custom(FONT.PoppinsRegular, size: 15.00)).foregroundColor(Color("ThemeBlackColor"))
}
.frame(width: 30, height: 25)
.background(Color("AddItemBG"))
}
Image("plus").renderingMode(.original)
.contentShape(Rectangle())
.clipped()
.frame(width: 25, height: 30)
.gesture(
TapGesture()
.onEnded { _ in
if Int((self.getCartDetails?.data?.items![nm].quantity)!)! < 999{
var count = Int((self.getCartDetails?.data?.items![nm].quantity)!)!
count += 1
self.updateMyCart(cartid: (self.getCartDetails?.data?.cartid)!, itemid: ((self.getCartDetails?.data?.items![nm].productid)!), quantity: count, itemindex: nm)
}
}
)
}.frame(width: 80, height: 25)
.overlay(
RoundedRectangle(cornerRadius: 3.0)
.stroke(Color("borderColor"), lineWidth: 1.0)
)
}
}.frame(height: 25)
}
}
}
}
}.padding(.top, 10)
BackgroundDivider()
//---------Apply Coupon View
GeometryReader { geometry in
//------------ PromoCode
VStack() {
HStack{
Image("couponTick").padding(.leading, 5)
.frame(height: 15)
Text("Apply Coupon")
.frame(height: 20)
.font(Font.custom(FONT.PoppinsBold, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
Spacer()
}.padding(.bottom, 10)
.frame(height: 15)
HStack{
TextField("Enter Coupon Code", text: self.$couponCode, onEditingChanged: { (bool) in
}) {
//oncommit
}.modifier(TextFieldModifier())
Button(action: {
self.callApplyCouponCodeAPI(self.couponCode)
}) {
Text("Apply").frame(width: geometry.size.width - 70).font(Font.custom(FONT.PoppinsRegular, size: 15.00))
}.modifier(MyGreenButtonModifier(width: geometry.size.width / 3))
}.frame(height: 40)
//-----------
//Billing and Price
}
.background(Color.white)
}.frame(height: 50)
.padding(.bottom, 10)
.padding(.top, 10)
//-------------------
BackgroundDivider()
//MARK:- Billing and Tax view
VStack(alignment: .leading, spacing: 5){
HStack{
Image("billDetails")
Text("Bill Details")
.font(Font.custom(FONT.PoppinsBold, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
}.frame(height: 25)
.padding(.bottom, 5)
if ((self.getCartDetails?.data?.saveamount)!) > 0{
HStack{
Text("Your total savings")
.font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeGreenColor"))
.padding(.leading, 10)
Spacer()
Text("\(self.getCartDetails?.data?.saveamount ?? 0)")
.font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeGreenColor"))
.padding(.trailing, 10)
} .overlay(
RoundedRectangle(cornerRadius: 4.0)
.stroke(Color("ThemeGreenColor"), lineWidth: 1.0)
.frame(height: 40)
)
.frame(height: 40)
.background(Color("AddItemBG"))
.padding(.bottom, 10)
}
HStack{
Text("Item Total").font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
Spacer()
Text("\((self.getCartDetails?.data?.saveamount ?? 0)+(self.getCartDetails?.data?.subtotal ?? 0))").font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
}
HStack{
Text("Tax").font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
Spacer()
Text("\((self.getCartDetails?.data?.taxamount ?? 0))").font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
}.frame(height: 30)
Divider()
if self.getCouponCodeObj != nil{
HStack{
Text("Coupon - (\(self.couponName))").font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeGreenColor"))
Spacer()
Text("\(self.couponDiscountAmount)").font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color("ThemeGreenColor"))
}.frame(height: 30)
Divider()
}
HStack{
Text("To Pay").font(Font.custom(FONT.PoppinsBold, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
Spacer()
Text("\((self.getCartDetails?.data?.taxamount ?? 0)+(Int(self.getCartDetails?.data?.subtotal ?? 0) - self.couponDiscountAmount))").font(Font.custom(FONT.PoppinsBold, size: 15.00))
.foregroundColor(Color("ThemeBlackColor"))
}
}//.frame(height: 200)
BackgroundDivider().padding(.bottom, -10)
GeometryReader { geometry in
VStack{
Button(action: {
self.callPlaceOrderAPI()
}) {
HStack{
Spacer()
Image("whiteRight").frame(width: 20, height: 20).foregroundColor(.white)
Text("Place Order")
.padding(.trailing, 10)
.font(Font.custom(FONT.PoppinsRegular, size: 15.00))
.foregroundColor(Color.white)
Spacer()
}
}.padding(.top, 10)
.frame(minWidth: 500,
maxWidth: .infinity,
minHeight: 50,
maxHeight: 50,
alignment: .center)
.background(Color("ThemeGreenColor"))
}
.background(Color("backGroundColor"))
}.padding(.top, -10)
} //list Ends here
@State var getCartDetails: GetCartDetailsRootClass!
Я обработал все данные через API response
и пытаюсь к управлению в UI
. Но проблема возникает только когда item = 0 . Каждый раз для элемента уменьшения и увеличения я вызываю itemDetails API , для мгновенного отражения в тележке . Но когда элемент равен только 1 и удаляется этот элемент, данные обновляются правильно, но ForEach
list count
не обновляется согласно DataArray.count
- Когда количество элементов = 0 я получаю ошибку ниже
Почему не обновляется диапазон SwiftUI ForEach l oop?
SwiftUI : ForEach в Picker не обновляется SwiftUI ForEach неправильно обновляется в scrollview Получить индекс в ForEach в SwiftUI Как обновить sh количество отображаемых элементов ForEach после изменения размера массива (SwiftUI, Xcode 11 Beta 5) Как использовать .enumerated () с ForEach в SwiftUI? Но не работает.
Примечание: - Здесь я загрузил весь код списка, потому что раньше некоторые решения работали в ForEach
но эти решения вызывают ошибки во внутреннем представлении.