Удалите более одной строки с помощью ondelete в swiftUI - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь создать список товаров с ценой рядом с ним. Кажется, что все работает отлично, за исключением функции ondelete (), я не могу найти способ удалить обе строки в прайс-листе и в списке товаров и всегда выдает фатальную ошибку вне допустимого диапазона. Пытался создать числовой массив и поместить его в foreach l oop, но он все равно дал фатальную ошибку, вне диапазона ...

@State var itemn = 0
@State var priceList : [String] = [""]
@State var itemList : [String] = [""]
@State var isEditing = false

func deleteItems(at offsets: IndexSet) {
    let a = offsets.count 
    priceList.remove(at: a)
    itemList.remove(at: a)
}

var body: some View {
    GeometryReader{ res in

        ZStack{
            Spacer()
        }.padding().background(LinearGradient(gradient: Gradient(colors: [Color(red: 0.171, green: 0.734, blue: 0.955), .white]), startPoint: .bottom, endPoint: .trailing)).background(Color(red: 0.171, green: 0.734, blue: 0.955)).edgesIgnoringSafeArea(.bottom)

        ZStack{
            VStack{
                Form{
                    Section{
                        HStack{
                            Section(header: Text("To-Do List ").font(.largeTitle).fontWeight(.thin)){
                                Spacer()
                                Button(action: {
                                    self.itemn += 1
                                    self.itemList.append("")
                                    self.priceList.append("")
                                    print(self.itemList)
                                }, label: {
                                    Text("Add")

                                })


                            }
                        }

                        List{
                            ForEach(0 ... self.itemn, id: \.self){s in
                                VStack{
                                    HStack{
                                        Text("Title: ")
                                        TextField("Expense ", text: self.$itemList[s])
                                    }
                                   HStack{
                                        Text("Price: $")
                                        TextField("0.00", text: self.$priceList[s]).keyboardType(.decimalPad)
                                    }

                                Button(action: {
                                    self.priceList.remove(at: 0)
                                    self.itemList.remove(at: 0)
                                }, label: {
                                    Text("delete")
                                })

                                }
                            }.onDelete(perform: self.deleteItems)
                        }

                    }
                }.onAppear {
                    UITableViewCell.appearance().backgroundColor = .clear
                    UITableView.appearance().backgroundColor = .clear
                    UITableView.appearance().separatorColor = .clear
                }.padding()
                Spacer()
            }
        }

    }.navigationBarItems(leading: Text("To - List").font(.largeTitle).fontWeight(.thin).padding(.top))
}

}

1 Ответ

0 голосов
/ 06 мая 2020

Изменение состояния принудительно обновляется синхронно, поэтому вы получаете несовпадение двух массивов. Решением может быть использование массива значений элемента модели вместо двух массивов, например

struct Item {
   let id = UUID() // id is per-your choice
   var item: String = ""
   var price: String = ""
}

@State var itemList : [Item] = []

, конечно, с обновленным ниже представлением logi c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...