Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

277
Visualizações
Cómo pasar datos entre ViewModels en SwiftUI

Tengo este caso de uso en el que tengo una vista principal y una vista secundaria. Ambas vistas tienen sus propios ViewModels correspondientes.

ParentView:

 struct ParentView: View { @StateObject var parentViewModel = ParentViewModel() var body: some View { NavigationView { List { TextField("Add Name", text: $parentViewModel.newListName) NavigationLink(destination: ChildView()) { Label("Select Products", systemImage: K.ListIcons.productsNr) } } } }

ParentViewModel:

 class AddListPopoverViewModel: ObservableObject { @Published var newListName: String = "" func saveList() { // some logic to save to CoreData, method would be called via a button // how do I reference "someString" from ChildViewModel in this ViewModel? } }

ChildView:

 struct ChildView: View { @StateObject var childViewModel = ChildViewModel() var body: some View { NavigationView { List{ Text("Some element") .onTapGesture { childViewModel.alterData() } } } } }

ChildViewModel:

 class ChildViewModel: ObservableObject { @Published var someString: String = "" func alterData() { someString = "Toast" } }

Mi pregunta ahora es, ¿cómo paso el nuevo valor de "someString" de ChildViewModel a ParentViewModel, para hacer más cosas con él? Intenté crear una @StateObject var childViewModel = ChildViewModel() en ParentViewModel, pero eso obviamente no funciona, ya que creará una nueva instancia de ChildViewModel y, por lo tanto, no conoceré los cambios realizados en "someString"


Solución: según lo propuesto por Josh, seguí el enfoque de usar un solo ViewModel en lugar de dos. Para lograr esto, ParentView necesita un modificador .environmentObject .environmentObject(T) .

ParentView:

 struct ParentView: View { @StateObject var parentViewModel = ParentViewModel() var body: some View { NavigationView { List { TextField("Add Name", text: $parentViewModel.newListName) NavigationLink(destination: ChildView()) { Label("Select Products", systemImage: K.ListIcons.productsNr) } } }.environmentObject(parentViewModel) }

ChildView luego hace referencia a ese objeto de entorno a través @EnvironmentObject sin un inicializador:

 struct ChildView: View { @EnvironmentObject var parentViewModel: ParentViewModel var body: some View { NavigationView { List{ Text("Some element") .onTapGesture { parentViewModel.alterData() } } } } }
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Lo más probable es que use un enlace para esta situación:

 struct ChildView: View { @Binding var name: String var body: some View { NavigationView { List{ Text("Some element") .onTapGesture { name = "Altered!" } } } } }

Y en el padre:

 struct ParentView: View { @StateObject var parentViewModel = ParentViewModel() var body: some View { NavigationView { List { TextField("Add Name", text: $parentViewModel.newListName) NavigationLink(destination: ChildView(name: $parentViewModel.newListName)) { Label("Select Products", systemImage: K.ListIcons.productsNr) } } } }

Además, creo que puede eliminar la vista NavigationView de ChildView . Tener ParentView es suficiente.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda