Удалить весь список в SwiftUI

Есть ли способ удалить все элементы списка в SwiftUI? Я использую ForEach() внутри List(), и мне нужна кнопка «Очистить все», чтобы удалить все элементы из списка. Есть ли способ сделать это?


struct SwiftUIView: View {
    @State var filters : [filter] = [filter(name: "new"), filter(name: "old"), filter(name: "some")]
    @State var afterFilters : [someFilter] = []
    var body: some View {
        List{
            ForEach(0..<self.filters.count, id:\.self){ i in
                filterRepresent(string: self.$afterFilters[i].filter.name, isOn: self.$afterFilters[i].isOn)
            }
        }.onAppear {
            for filter in self.filters {
                self.afterFilters.append(someFilter(filter: filter))
            }
        }
        }
       
}

struct filterRepresent : View {
    @Binding var string : String
    @Binding var isOn : Bool
    var body : some View {
        HStack{
            Text(string)
            Toggle("",isOn: $isOn)
        }
    }
}
struct filter {
    var name : String
    var isOn : Bool
    init(name: String){
        self.name = name
        self.isOn = false
    }
}
struct someFilter : Identifiable{
    var id : Int
    var filter : filter
    var isOn : Bool
    
    init(filter : filter){
        self.id = Int.random(in: 0...100000)
        self.filter = filter
        self.isOn = filter.isOn
    }
}

Как вы можете видеть, в приведенном выше примере я использую @Binding для изменения данных, которые я храню, в зависимости от состояния Toggle, я хочу иметь кнопку, которая удаляет весь список (в реальном приложении данные в список загружается со стороны сервера во временный массив, как показано выше), когда я делаю это с помощью .removeall (), я получаю ошибку вне индекса.

Кнопка, которую я использую:

Button(action: {
   self.afterFilters.removeAll()
}, label: {
   Text("Clear all").font(Font.custom("Quicksand-Medium", size: 15))
})

Ошибка, которую я получаю: Неустранимая ошибка: индекс вне допустимого диапазона: файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, строка 444


person TheMachineX    schedule 18.08.2020    source источник


Ответы (1)


Вам нужно очистить модель, и вид будет обновлен автоматически.

Вот простая демонстрация:

struct DemoCleanUpList: View {

    @State private var persons = ["Person 1", "Person 2", "Person 3"]

    var body: some View {
        VStack {
            Button("CleanUp") { self.persons.removeAll() }
            List {
                 ForEach(persons, id: \.self) { person in
                    Text(person)
                }
            }
        }
    }
}
person Asperi    schedule 18.08.2020
comment
Итак, по какой-то причине, когда я это делаю, я получаю ошибку вне индекса, почему это может быть? Я использую цикл ForEach с подсчетом массива - person TheMachineX; 18.08.2020
comment
Для изменения содержимого ForEach необходимо использовать динамический конструктор ForEach. Подробнее см. stackoverflow.com/a/58911168/12299030. - person Asperi; 18.08.2020
comment
Я использую конструктор точно так же, как в примере, который вы отправили, так странно - person TheMachineX; 18.08.2020