在 SwiftUI 中删除整个列表

Posted

技术标签:

【中文标题】在 SwiftUI 中删除整个列表【英文标题】:Delete entire list in SwiftUI 【发布时间】:2020-08-18 12:29:58 【问题描述】:

有没有办法删除 SwiftUI 中的所有列表项? 我在List() 中使用ForEach(),我想要一个清除所有按钮来从列表中删除所有项目,有没有办法做到这一点?


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 行

【问题讨论】:

【参考方案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)
                
            
        
    

【讨论】:

所以,由于某种原因,当我这样做时,我得到了一个超出索引的错误,为什么会这样?我使用带有数组计数的 ForEach 循环 要修改 ForEach 的内容,您需要使用 ForEach 动态构造函数。详情见***.com/a/58911168/12299030。 我正在使用构造函数,就像你发送的示例一样,太奇怪了

以上是关于在 SwiftUI 中删除整个列表的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 试图从列表中删除对象但无法在不可变值上使用变异成员:是一个“让”常量

SwiftUI 中的列表视图占据整个屏幕高度

无法使用 SwiftUI 在列表中显示整个字符串

SwiftUI:无法删除列表中的行

从 SwiftUI 中的列表中删除绑定

如何在 SwiftUI 中删除列表的左右填充?