Comment faire pour supprimer un élément dans une boucle forEach avec une suppression btn pour chacune d'elle. J'utilise swiftUI avec base de données

0

La question

Voici le code si vous ne comprenez pas

struct cartView: View {
        @Environment(\.managedObjectContext) private var viewContext
    
        @FetchRequest(
            sortDescriptors: [], animation: .default) private var products: FetchedResults<Prod>
        
        let columns = [GridItem(.flexible()), GridItem(.flexible())]
        @State var indx = 0
    
        var body: some View {
            NavigationView {
                ScrollView {
                    VStack {
                        LazyVGrid(columns: columns) {
                            ForEach(products, id: \.self) {prod in
                                let prodItems = Product(name: prod.name ?? "Undefined", price: prod.price ?? "Undefined", type: "type", brand: prod.brand ?? "Undefined", images: [prod.image!,""])
                                
                                    ZStack {
                                    Cells(product: prodItems)
                                    // I want the button below delete the item of the 
                                    // button pressed with the function below
                                    Button(action: {}) {
                                        Image(systemName: "xmark.bin.circle")
                                            .resizable()
                                            .frame(width: 30, height: 30)
                                            .foregroundColor(.red)
                                            .background(.black)
                                            .clipShape(RoundedRectangle(cornerRadius: 20))
                                            .offset(x: 60, y: 45)
                                    }
                                }
                            }
                        }
                    }
                }
                .navigationTitle("Cart")
            }
        }
        
        private func deleteItems(offsets: IndexSet) {
            withAnimation {
                offsets.map { products[$0] }.forEach(viewContext.delete)
    
                do {
                    try viewContext.save()
                } catch {
                    let nsError = error as NSError
                    fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
                }
            }
        }
}

donc, la question ici est le bouton de la boucle forEach pour supprimer l'élément que l'utilisateur a appuyé sur le bouton et je sais comment le faire, mais ce que je ne sais pas est comment faire pour obtenir l'index de l'élément et de le passer à la fonction.

core-data swift swiftui
2021-11-14 09:37:14
1

La meilleure réponse

0

Vous n'avez pas besoin de l'indice si vous êtes à la délivrance de la suppression de l'instruction de l'intérieur de la boucle, comme votre NSManagedObjectContext exemple, a une delete(_:) méthode qui prend l'objet lui-même. Ce changement va se propager par le biais de votre @FetchRequest objet automatiquement, votre SwiftUI vue de la mise à jour pour montrer la collection sans l'objet supprimé.

Si votre bouton d'action devient:

Button(action: {
  viewContext.delete(prod)
}) {
  Image(systemName: ...)
  // etc.
}

Notez que lorsque vous verrez l'effet tout de suite, la suppression sera uniquement en mémoire jusqu'à ce que vous appelez save sur la gestion du contexte de l'objet.

Dans mon CoreData apps, j'ai tendance à enregistrer mes modifications séparément, par exemple lorsque l'application est sur le point d'aller dans l'arrière-plan. Mais si vous voulez déclencher un enregistrement immédiatement l'objet est supprimé, c'est assez simple:

Button(action: {
  viewContext.delete(prod)
  try? viewContext.save()
}) {
  Image(systemName: ...)
  // etc.
}

NB: la documentation NSManagedObjectContext.save() dit que vous devriez vérifier le hasChanges bien avant de tenter de le sauver, mais que vous avez juste fait un changement dans la ligne ci-dessus, ce n'est pas nécessaire dans cet exemple particulier.

2021-11-14 16:37:10

merci beaucoup, Cela fonctionne, u m'a vraiment aidé!
Fovu

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................