Mostrar/Ocultar Barra de Progreso
Actualmente no existe un modificador que permita ocultar una vista dado un valor. Una solución es hacer una extensión de View que incluya este comportamiento:
extension View {
@ViewBuilder func isHidden(_ isHidden: Bool) -> some View {
if isHidden {
self.hidden()
} else {
self
}
}
}
Ahora podríamos aplicarla, por ejemplo, para mostrar/ocultar una barra de progreso mientras se realiza una tarea asincrónica:
Primero:
Definir la función asincrónica que realizará la tarea en segundo plano. Para hacerla lo más completa posible vamos a hacer una función que acepte un parámetro y devuelva el valor de ese parámetro en un closure:
func test( name : String, action: @escaping (String)->()) async {
let tt = name.lowercased()
sleep(3) //Hace una pausa de 3 segundo para simular trabajo…
return action(tt)
}
Segundo: dentro de nuestra Vista:
Nota: en este ejemplo, se muestra una barra de progreso circular hasta que se completa la tarea asincrónica. Después de lo cual se oculta.
@State private var show = true
VStack {
Text(text)
.padding(25)
.overlay { //Mostrar la barra de progreso
ProgressView(label: {
Text("Cargando...")
})
.frame(width: 200) //Para que se vea todo el texto
.isHidden(isHidden)
}
Button("OK"){
text = ""
isHidden = false
//las funciones async deben de llamarse dentro de un contexto asincrónico y siempre precedidas por await
Task{
await test(name: "Yorjandis") { str in
text = str
isHidden = true
}
}
}
}