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.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    struct MainView: View {
    
        @State private var enabled = false
    
        var body: some View {
            SubView(enabled: $enabled)
            Button("Button") {
                enabled.toggle()
            }
        }
    }
    
    struct SubView: View {
    
        @Binding var enabled: Bool
    
        var body: some View {
            if enabled {
                Text("Some Label")
            }
        }
    
        init(enabled: Binding<bool>) {
            self._enabled = enabled
            // Agregamos un observador `didSet` al enlace
            self._enabled.didSet {
                print("El estado habilitado de SubView ha cambiado a \(enabled)")
            }
        }
    
        public func change() {
            enabled.toggle()
        }
    }
    

    En el método de init de SubView, estamos configurando un enlace personalizado (Binding) basado en la propiedad enabled pasada como parámetro. También estamos agregando un observador didSet al enlace, el cual se llamará cada vez que cambie el valor de enabled.

    Ahora, puedes usar SubView de la siguiente manera:

    SubView(enabled: $enabled)
    

    Y cada vez que actualices enabled en la vista principal, se llamará al observador didSet en SubView, 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.

Comments are closed.