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.

¿Es posible tener un confirmationDialog en el menú de SwiftUI?

He visto una aplicación que utiliza Menu donde cuando presionas un botón, se te pide que “confirmes”. Esto me llevó a refactorizar mi aplicación:

@State var confirmDeletion: Bool = false

VStack {
    Button(role: .destructive) {
        self.confirmDeletion = true
    } label: {
        Spacer()
        Text("Eliminar")
        Spacer()
    }.confirmationDialog(
        "¿Estás seguro?",
        isPresented: $confirmDeletion,
        titleVisibility: .visible
    ) {
        Button("Sí", role: .destructive) {
            DispatchQueue.main.async {
                Task {
                    await doSomeAsynWork()
                }
            }
        }
        Button("Cancelar", role: .cancel) {}
    }
}

Esto funciona muy bien. Ahora, para refactorizar usando Menu:

Menu {
    [..] // otros botones

    Button(role: .destructive) {
        print("Fui llamado... y eso es todo")
        self.confirmDeletion = true
    } label: {
        Label("Eliminar", systemImage: "trash")
    }.confirmationDialog(
        "¿Estás seguro?",
        isPresented: $confirmDeletion,
        titleVisibility: .visible
    ) {
        Button("Sí", role: .destructive) {
            DispatchQueue.main.async {
                Task {
                    await doSomeAsynWork()
                }
            }
        }
        Button("Cancelar", role: .cancel) {}
    }
} label: {
    Label("Menú", systemImage: "line.horizontal.3.decrease.circle")
}

Entiendo que cuando presionas cualquier botón del menú, se cierra de inmediato, por eso la confirmationDialog no funciona. ¿Podría lograr una confirmationDialog con Menu?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, actualmente no es posible utilizar confirmationDialog con la vista Menu. Cuando se presiona un botón de Menu, este se cierra inmediatamente y realiza la acción asociada al elemento seleccionado. Si necesitas una confirmación antes de realizar la acción, sería mejor utilizar un botón con confirmationDialog fuera del Menu, como en el ejemplo de código inicial.

    Alternativamente, podrías intentar crear una vista personalizada para mostrar el cuadro de diálogo de confirmación que puedas mostrar desde dentro de la acción del Menu, en lugar de utilizar el confirmationDialog incorporado. Sin embargo, debes tener en cuenta que esto puede no ser tan amigable para el usuario como la versión incorporada y podría tener implicaciones de accesibilidad.

Comments are closed.