es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SwiftUI `swipeActions` y `confirmationDialog` eliminan el elemento equivocado.

Estoy intentando usar swipeActions y confirmationDialog de iOS 15.0 para eliminar un elemento en una lista.

Pero lo que sucede es que se elimina el elemento equivocado.

Aquí está mi código:

struct ConversationsSection: View {

@State private var isShowingDeleteActions = false

let items = [“Uno”, “Dos”, “Tres”, “Cuatro”, “Cinco”]

var body: some View {
List(items, id: .self) { item in
Text(item)
.swipeActions(edge: .trailing) {
Button(role: .destructive) {
isShowingDeleteActions = true
print(“Intentando eliminar: ” + item)
} label: {
Label(“Eliminar”, systemImage: “trash”)
}
}
.confirmationDialog(“¿Eliminar elemento?”, isPresented: $isShowingDeleteActions) {
Button(“Confirmar Eliminar”, role: .destructive) {
print(“Eliminando en realidad: ” + item)
isShowingDeleteActions = false
}
}
}
}

}

La salida es:

Intentando eliminar: Dos
Eliminando en realidad: Cuatro
Intentando eliminar: Cinco
Eliminando en realidad: Tres

Así que deslizo un elemento y se presenta confirmationDialog. Pero dentro de confirmationDialog se pasa otro elemento. ¿Por qué sucede esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el confirmationDialog está usando el elemento equivocado. ¿Hay alguna manera de arreglar esto?

    Parece que el problema es que el confirmationDialog está utilizando el elemento equivocado. Para solucionarlo, puedes usar el modificador onDelete para especificar qué elemento debe eliminarse cuando se presenta el confirmationDialog.

    Por ejemplo:

    List(items, id: \.self) { item in
        Text(item)
            .swipeActions(edge: .trailing) {
                Button(role: .destructive) {
                    isShowingDeleteActions = true
                    print("Tratando de eliminar: " + item)
                } label: {
                    Label("Eliminar", systemImage: "trash")
                }
            }
            .onDelete {
                print("Eliminando en realidad: " + item)
            }
            .confirmationDialog("¿Eliminar elemento?", isPresented: $isShowingDeleteActions) {
                Button("Confirmar eliminación", role: .destructive) {
                    isShowingDeleteActions = false
                }
            }
    }
    

    De esta manera, el modificador onDelete se llamará con el elemento correcto cuando se presente el confirmationDialog.

Comments are closed.