【问题标题】:Delete item from a section list on SwiftUI从 SwiftUI 上的部分列表中删除项目
【发布时间】:2020-06-18 16:10:57
【问题描述】:

概述

我正在使用核心数据做一个简单的应用程序我有两个实体用户和区域该应用程序按区域显示用户列表问题是在删除操作中,如果我尝试从第一部分删除用户从第二部分中删除第二个用户它从第一部分中删除第二个用户。

我认为索引集在发送该部分的索引时出错,但是当我尝试将 onDelete 更改为我的嵌套 forEach 时不起作用

这里是代码

import SwiftUI

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: User.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \User.name, ascending: true)]) var users: FetchedResults<User>
    @FetchRequest(entity: Territory.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Territory.name, ascending: true)]) var territories: FetchedResults<Territory>
    @State private var showAddUser = false


       var body: some View {
           GeometryReader{ geometry in
               NavigationView {
                   ZStack {

                       List {
                           ForEach(self.territories, id: \.self) { territorie in
                            Section(header: Text(territorie.wrappedName)) {
                                ForEach(territorie.usersArray, id: \.self) { user in
                                    NavigationLink(destination: UserView(user: user)) {
                                        VStack{
                                            HStack{
                                               Text("user")
                                                Spacer()
                                                Text(user.dayLastVisit)
                                                    .padding(.horizontal)
                                            }
                                            HStack {
                                                Text(user.wrappedEmoji)
                                                    .font(.largeTitle)
                                                VStack(alignment: .leading) {
                                                    Text("\(user.wrappedName + " " + user.wrappedLastName)")
                                                        .font(.headline)
                                                    Text(user.wrappedType)

                                                }
                                                Spacer()
                                            }
                                        }

                                    }
                                }.onDelete(perform: self.deleteItem)
                            }
                           }



                       }
                       .listStyle(GroupedListStyle())
                       .environment(\.horizontalSizeClass, .regular)

                       VStack {
                           Button(action:{ self.showAddRUser.toggle()}){
                               ButtonPlus(icon:"plus")}
                           .offset(x: (geometry.size.width * 0.40), y: (geometry.size.height  * 0.38))
                           .sheet(isPresented: self.$showAddUser){
                               NewUserView().environment(\.managedObjectContext, self.moc)
                                  }
                       }
                   }
               .navigationBarTitle("Users")
                   .navigationBarItems( trailing: HStack {
                    EditButton()
                    Button(action:{self.showAddUser.toggle()}){
                    ButtonNew(text:"Nueva")}
                    }

                    .sheet(isPresented: self.$showAddUser){
                        NewUserView().environment(\.managedObjectContext, self.moc)
                   }
                   )

               }
           }
       }
    func deleteItem(at offsets: IndexSet) {
        for offset in offsets { 
            let user = users[offset]

            //borarlo del context
            moc.delete(user)

        }
        try? moc.save()
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我正在学习 swift 和 swiftui,所以我会很感激任何帮助

【问题讨论】:

    标签: ios swift xcode core-data swiftui


    【解决方案1】:

    感谢 Kevin Renskers 的帮助,他找到了解决方案。我只是在我的函数中添加了一个.onDelete { self.deleteItem(at: $0, in: territorie)},然后我使用了该地区的相同 arrayUsers。

     func deleteItem(at offsets: IndexSet, in ter: Territory) {
            
            for offset in offsets {
                 let user =  ter.usersArray[offset] 
                moc.delete(user)
                
            }
            try? moc.save()
        }
    

    【讨论】:

      【解决方案2】:

      对我来说,解决方案如下:

      ForEach(self.territories, id: \.self) { territorie in
      
          Section(header: Text(territorie.wrappedName)) {
      
              ForEach(territorie.usersArray, id: \.self) { user in
                  // your code here
              }
              .onDelete { indexSet in
                  for index in indexSet {
                      moc.delete(territorie[user])
                  }
                      
                  // update the view context
                  moc.save()
              }
          }
      }
      

      indexSet 中的 index 返回应在该特定部分中删除的项目。所以如果我删除一个部分的第一项,它会返回 0。

      territorie 返回该部分中包含的所有项目的列表。因此使用 territorie[index] 将返回您要删除的特定用户对象。

      现在我们有了要删除的对象,我们可以将它传递给moc.delete(territorie[index])。最后,我们用moc.save()保存它。

      旁注:虽然 Misael 使用了变量 'territorie',但我更喜欢使用变量名 section

      【讨论】:

        【解决方案3】:

        您需要传入节索引和行索引,以便知道要删除哪个嵌套项。像这样的东西。

        .onDelete { self.deleteItem(at: $0, in: sectionIndex) }

        并更改您的函数以接受该部分索引:

        func deleteItem(at offsets: IndexSet, in: Int)

        在您的情况下,您可能可以传入 territorie.id 之类的内容作为部分索引,并使用它来删除正确的项目。或者传入territorie 对象——无论你需要什么来获取正确的用户。只有索引不会让你到达那里。希望一切都有意义!

        【讨论】:

        • 您好,谢谢!我有 User.id 和 Territory.id,UUID 和领土都与用户有一对多的关系,要传递 territorie.id 作为部分索引,我只需要更改 .id 的 .self 吗?
        • 成功了!我只是传递了territorie 对象然后我使用对象的territorie.usersArray 而不是用户[offset] 来删除正确的用户
        猜你喜欢
        • 2021-08-29
        • 1970-01-01
        • 2020-08-31
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多