SwiftUI: ¿Cómo cambiar una subvista?
Quiero cambiar el estado de una subvista a través de una llamada a función de la subvista. Pero la vista no se está actualizando.
struct MainView: View {
var subView: SubView = SubView()
var body: some View {
subView
Button("Botón") {
subView.change()
}
}
}
struct SubView: View {
@State private var enabled = false
var body: some View {
if enabled {
Text("Alguna etiqueta")
}
}
public func change() {
enabled.toggle()
}
}
Es posible hacer esto con @Binding, como se describe aquí: https://www.hackingwithswift.com/forums/swiftui/calling-functions-of-sub-views/1960
Pero no estoy satisfecho con esta solución, porque quiero extraer una vista completamente. Con @Binding aún tengo algo de cosas de subvista en mi vista principal.
davy.ai
Si deseas extraer completamente la vista y aún así poder actualizar su estado desde la vista principal, puedes usar una combinación de un enlace personalizado (
Binding
) y un observador de propiedad (didSet
). Aquí tienes un ejemplo:En el método de
init
deSubView
, estamos configurando un enlace personalizado (Binding
) basado en la propiedadenabled
pasada como parámetro. También estamos agregando un observadordidSet
al enlace, el cual se llamará cada vez que cambie el valor deenabled
.Ahora, puedes usar
SubView
de la siguiente manera:Y cada vez que actualices
enabled
en la vista principal, se llamará al observadordidSet
enSubView
, lo que te permitirá actualizar el estado de la vista en consecuencia.Nota: Ten en cuenta que este enfoque no se recomienda para vistas complejas con muchos estados, ya que puede volverse rápidamente difícil de manejar. En esos casos, debes considerar usar
@Binding
en su lugar.