1
votes

Is there a way to delete all the list items in SwiftUI? I'm using a ForEach() inside a List() and I want to have a clear all button to remove all the items from the list, is there a way to do it?


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
    }
}

As you can see, in the example above, I'm using a @Binding to change the data I store based on the Toggle state, I want to have a button that deletes the entire list (in the real app the data to the list is uploaded from a server side into a temp array just like in the above) when I do it with .removeall() I get thrown with "out of index" error.

The button I use :

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

The error I'm getting: Fatal error: Index out of range: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444

1

1 Answers

2
votes

You have to clean up model and view will be refreshed automatically.

Here is a simple demo:

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)
                }
            }
        }
    }
}