Содержимое списка Swiftui не перезагружается при изменении значения массива в xcode 11.3 и новее - PullRequest
0 голосов
/ 06 августа 2020

Я использую 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 но эти решения вызывают ошибки во внутреннем представлении.

...