¿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?
davy.ai
Desafortunadamente, actualmente no es posible utilizar
confirmationDialog
con la vistaMenu
. Cuando se presiona un botón deMenu
, 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 conconfirmationDialog
fuera delMenu
, 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 elconfirmationDialog
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.