如何删除 List 中的项目? SwiftUI

Posted

技术标签:

【中文标题】如何删除 List 中的项目? SwiftUI【英文标题】:How can I delete an item in a List ? SwiftUI 【发布时间】:2021-01-26 08:53:38 【问题描述】:

我正在尝试使用编辑按钮和函数来编辑列表(由可变字符串组成)。我的代码是:

struct annotationsView: View 
    
    
    @State private var text = ""
    //    annotations
    @State var annotations : [[AnnData]] = [[]]
    
    var body: some View 
        VStack
            Form
                HStack
                    TextField("Add your annotations here", text: $text)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                    
                    Button("Submit") 
                        annotations[annotations.count - 1].append(AnnData(Anntext: text))
                        self.hideKeyboard()
                        text = ""
                    
                
                List
                    ForEach(annotations.indices, id:\.self)index in
                        
                        ForEach(annotations[index].indices, id:\.self)annotationIndex in
                            
                            Text(annotations[index][annotationIndex].Anntext)
                        .onDelete(perform: self.deleteItem) //<-- Here
                    
                
                
            
        
        .background(
            Image("Background")
                .resizable()
                .edgesIgnoringSafeArea(.all)
                .navigationBarTitle(Text("Annotations"), displayMode: .inline)
        )
        .navigationBarItems(trailing: EditButton())
    
    
    private func deleteItem(at indexSet: IndexSet) 
        annotations.remove(atOffsets: indexSet)
    

struct AnnData : Identifiable
    
    var id = UUID().uuidString
    var Anntext: String

目前,我无法删除单个项目;当我删除一个时,其余的会自动删除。此外,之后我无法在列表中添加一些项目。 你介意解释一下这里出了什么问题吗? 感谢您的帮助!

【问题讨论】:

【参考方案1】:

您需要在循环中删除项目,因为您的数据是一个二维数组。 像这样

List
    ForEach(annotations.indices, id:\.self)index in
        
        ForEach(annotations[index].indices, id:\.self)annotationIndex in
            
            Text(annotations[index][annotationIndex].Anntext)
        
        .onDelete  (indexSet) in
            annotations[index].remove(atOffsets: indexSet)
        //<-- Here
    

【讨论】:

以上是关于如何删除 List 中的项目? SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

iOS 15.3+ SwiftUI中List子项目禁止被删除但头部仍显示删除按钮的解决

iOS 15.3+ SwiftUI中List子项目禁止被删除但头部仍显示删除按钮的解决

如何从 SwiftUI 列表和领域中删除数据

如何从 Mac OS 中的 SwiftUI 列表中删除底部/顶部项目填充

如何在 SwiftUI 中删除 List 和 ScrollView 的底部填充

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