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 pasa datos de vista a vista.

Pasé 14 horas tratando de resolverlo hoy, revisé y busqué en línea, y vi videos, pero nada ayudó. Me rendí, así que decidí hacer una pregunta.

Normalmente, tengo dos vistas en una, como la lista a la izquierda y los detalles a la derecha. En el iPhone, pude usar la hoja para mostrar la segunda vista sin problemas, pero en el iPad, tengo una segunda vista en el lado derecho y no se actualiza cuando hago clic en la lista. Intenté usar @Binging y @State, pero no funcionó.

¿Cómo puedo pasar datos de una vista a otra?

El código del enlace de navegación:

let navigationItemList: [NavigationItems] = [NavigationItems(image: Image(systemName: “hourglass”), title: “Feature 1”, subtitle: “Subtitle”, linkView: AnyView(FeatureView1())),
NavigationItems(image: Image(systemName: “clock.arrow.2.circlepath”), title: “Feature 2”, subtitle: “Subtitle”, linkView: AnyView(FeatureView2()))]
struct ContentView: View {
var body: some View {
NavigationView {
List {
Section(footer: MainFooterView()) {
ForEach(navigationItemList) { items in
HStack {
items.image?
.frame(width: 30, height: 30)
.font(.system(size: 25))
.foregroundColor(color3)
Text(“”)
NavigationLink(items.title, destination: items.linkView)
}
.listRowBackground(Color.clear)
.listRowSeparatorTint(.clear)

                }
                .navigationTitle("Features")
                .listStyle(.insetGrouped)
            }
        }
    }
}

Primera vista:


struct FeatureView1 : View {
var body: some View {
HStack {
List(item) { items in
Button("Haga clic para actualizar el título en Feature View 2") {
FeatureView2(title: "Botón llamado") //No sucedió nada
}
}
FeatureView2()
}
}

Segunda vista:


var body: some View {
var title = ""
ZStack {
Text(title) //Cuando hago clic en un botón de la lista, debería mostrar "Botón llamado", pero nada sucede.
}
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para pasar datos entre dos vistas en SwiftUI, puedes usar @State, @Binding o @ObservedObject. Dado que mencionaste que ya has intentado usar @State y @Binding pero no funcionó, puedes intentar usar @ObservedObject.

    Así es como puedes usar @ObservedObject para pasar datos entre dos vistas:

    1. Crea una clase que cumpla con el protocolo ObservableObject. Esta clase contendrá los datos que deseas pasar entre las vistas.
    class DataHolder: ObservableObject {
        @Published var title: String = ""
    }
    
    1. En la primera vista, crea una instancia de DataHolder y pásala a la segunda vista como un objeto de entorno.
    struct FeatureView1: View {
        @ObservedObject var dataHolder = DataHolder()
    
        var body: some View {
            HStack {
                List(item) { items in
                    Button("Haga clic para actualizar el título en la vista de función 2") {
                        self.dataHolder.title = "Botón Llamado"
                    }
                }
                FeatureView2()
                    .environmentObject(dataHolder)
            }
        }
    }
    
    1. En la segunda vista, agrega un @EnvironmentObject envoltorio de propiedad para acceder a la instancia de DataHolder.
    struct FeatureView2: View {
        @EnvironmentObject var dataHolder: DataHolder
    
        var body: some View {
            ZStack {
                Text(dataHolder.title)
            }
        }
    }
    

    Con este código, cuando haces clic en el botón en la primera vista, se actualiza la propiedad de título en la instancia de DataHolder. Dado que la segunda vista tiene acceso a la misma instancia de DataHolder a través de @EnvironmentObject, actualizará automáticamente el texto de la vista con el nuevo valor del título.

    ¡Espero que esto ayude!

Comments are closed.