SwiftUI – Alert

Qué es Alert

El componente Alert permite crear una alerta nativa del sistema. Estas alertas se suelen componer de de un texto descriptivo y botones de acción.

Normalmente se usa para notificar al usuario sobre algo que ocurre en la aplicación o cuando debe tomar una decisión de aceptar o cancelar. Es un componente equivalente a UIAlertController de tipo .alert de UIKit. Como siempre, aquí puedes consultar la documentación oficial.

Para crear el componente se usa el siguiente inicializador:

Alert(title: Text("A question"), message: Text("Are you sure about that?"), primaryButton: .default(Text("Yes")), secondaryButton: .cancel(Text("No")))

El componente puede mostrar un título y una descripción y hasta dos botones. Estos botones pueden ser del siguiente tipo:

  • .default. Es el estilo por defecto.
  • .cancel. Representa la cancelación de la acción.
  • .destructive. Representa la destrucción de algún dato.

Estos estilos llevan asociada una representación visual acorde a la que se puede encontrar en todo el sistema operativo, por lo que es recomendable usar cada uno de ellos dependiendo de la acción asociada a cada uno de ellos.

Para ejecutar alguna acción al pulsar los botones del Alert se debe implementar el closure de cada uno de los botones que se ejecutará cuando se pulse cada botón.

Alert(title: Text("A question"), message: Text("Are you sure about that?"), primaryButton: .default(Text("Yes")) {
    //Pressed button Yes. Do Something
}, secondaryButton: .destructive(Text("No")) {
    //Pressed button No. Do Something
})

Cómo mostramos un Alert

Un Alert no se puede presentar de la misma forma que mostramos otros componentes de SwiftUI, ya que ni siquiera implementa el protocolo View.

Para mostrar un Alert hay que usar el modificador alert de View sobre la vista que queramos que lo presente. Este modificador necesita una variable de estado de tipo Bool, que será la encargada de indicar si el Alert es visible (true) o no (false).

@State private var showAlert = false

...

.alert(isPresented: $showAlert) {
    Alert(title: Text("A question"), message: Text("Are you sure about that?"), primaryButton: .default(Text("Yes")), secondaryButton: .destructive(Text("No")))
}

En este ejemplo, la propiedad showAlert deberá ser seteada a true cuando queramos que se muestre el Alert (por ejemplo cuando pulsemos un botón)

Está lógica es la misma que se usa con un NavigationLink cuando controlamos la navegación de forma manual.

Un ejemplo completo para mostrar un Alert sería el siguiente:

struct ContentView: View {
    @State private var showAlert = false
    @State private var buttonPressed: String?
    
    var body: some View {
        VStack(spacing: 15) {
            Button("Show Alert") {
                showAlert.toggle()
            }
            if let buttonPressed = buttonPressed {
                Text("You pressed (buttonPressed) button")
            }
            
        }
        .alert(isPresented: $showAlert) {
            Alert(title: Text("A question"), message: Text("Are you sure about that?"), primaryButton: .default(Text("Yes")) {
                buttonPressed = "Yes"
            }, secondaryButton: .destructive(Text("No")) {
                buttonPressed = "No"
            })
        }
    }
}

Modificadores comunes para Alert

A diferencia de otros componentes, Alert no tiene modificadores para poder personalizar su aspecto.

Ejemplo

Puedes encontrar este ejemplo en https://github.com/SDOSLabs/SwiftUI-Test bajo el apartado Alert.