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.

Cómo pasar una variable de estado a una segunda vista después de que haya sido incrementada en la primera vista en un bucle foreach.

Soy un traductor de documentos de TI y traduzco del inglés al español. Por favor, ten en cuenta que no traduciré el código y la salida en markdown.

Soy realmente nuevo en SwiftUI, así que por favor sé indulgente. Estoy tratando de pasar el valor de una variable de estado a una vista y quiero que la variable de estado se incremente dentro de un bucle ForEach. Aquí está el código que no funciona. La declaración de Text funciona bien usando la variable local val, pero la variable de estado val permanece sin cambios. Cualquier ayuda para resolver esto será apreciada. Las soluciones a problemas similares parecen no aplicarse.

struct ContentView: View {
@State
var val: Int = 25

var body: some View {
    VStack {
        ForEach(Array(stride(from: 10, to: 100, by: 10)), id: \.self) { val in
            HStack {
                Text("\(val)")
                SubView(val: $val)
            }
        }
    }
}

}

struct SubView: View {
@Binding var val: Int

var body: some View {
    Text("\(val)")
}

}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En el código proporcionado, el problema se encuentra en el conflicto entre la variable local ‘val’ utilizada en el bucle ForEach y la variable de estado ‘val’. Dentro del bucle, la variable local ‘val’ oculta la variable de estado ‘val’. Por lo tanto, cualquier cambio realizado en la variable local ‘val’ no afectará a la variable de estado ‘val’.

    Para pasar el valor de la variable de estado ‘val’ a la subvista para incrementar, deberíamos cambiar el nombre de la variable local ‘val’ en el bucle ForEach por algún otro nombre, por ejemplo, ‘loopVal’. Luego, pasamos la variable de estado ‘val’ a la subvista utilizando la palabra clave @Binding para que cualquier cambio realizado en la subvista se refleje en la variable de estado ‘val’.

    El código modificado se vería así:

    struct ContentView: View {
        @State var val: Int = 25
    
        var body: some View {
            VStack {
                ForEach(Array(stride(from: 10, to: 100, by: 10)), id: \.self) { loopVal in //renombrar la variable local a 'loopVal'
                    HStack {
                        Text("\(loopVal)")
                        SubView(val: $val) //pasar la variable de estado usando la palabra clave @Binding
                    }
                }
            }
        }
    }
    
    struct SubView: View {
        @Binding var val: Int
    
        var body: some View {
            Text("\(val)")
                .onTapGesture {
                    val += 1 //incrementar la variable de estado al hacer clic
                }
        }
    }
    

    En el código anterior, pasamos la variable de estado ‘val’ a la subvista ‘SubView’ utilizando la palabra clave @Binding. Dentro de la subvista, utilizamos la variable de estado ‘val’ como valor de visualización para la vista Text. También agregamos un gesto táctil en la vista Text para incrementar la variable de estado ‘val’ en cada clic.

Comments are closed.