Cómo eliminar un elemento en un bucle forEach con una eliminación btn para cada una de ella. Yo uso swiftUI con datos básicos

0

Pregunta

Aquí está el código si usted no entiende

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

así que la pregunta aquí es el botón que hay en el bucle forEach para eliminar el elemento que el usuario pulsa el botón y sé cómo hacerlo, pero lo que no sé es cómo obtener el índice del elemento y se apruebe en la función.

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

Mejor respuesta

0

Usted realmente no necesita el índice si vas a la emisión de la instrucción eliminar desde dentro del bucle, como su NSManagedObjectContext la instancia tiene un delete(_:) método que toma el objeto en sí. Que cambios se propagan a través de su @FetchRequest objeto de forma automática, su SwiftUI vista se actualizará para mostrar la colección sin el ahora-objeto eliminado.

Por lo que su botón de acción se convierte en:

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

Tenga en cuenta que mientras que usted va a ver el efecto inmediato, que la supresión sólo estará en la memoria hasta que usted llame save sobre el objeto administrado contexto.

En mi CoreData aplicaciones, tiendo a guardar mis cambios por separado, por ejemplo, cuando la aplicación está a punto de entrar en el fondo. Pero si usted quiere activar guardar inmediatamente se quita el objeto, que es lo suficientemente sencillo:

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

NOTA: la documentación para NSManagedObjectContext.save() dice que usted debe comprobar la hasChanges la propiedad antes de intentar ahorrar, pero como usted acaba de hacer un cambio en la línea de arriba, que no es necesario en este ejemplo en particular.

2021-11-14 16:37:10

muchas gracias, funciona, u realmente me ayudó!
Fovu

En otros idiomas

Esta página está en otros idiomas

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