删除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状态存储的数据,我想要一个按钮来删除整个列表(在实际应用中,数据列表中的内容从服务器端上传到temp数组中,就像上面一样),当我使用.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行

解决方法

您必须清理模型,视图才会自动刷新。

这是一个简单的演示:

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