SwiftUI observa el objeto publicado de un objeto publicado.
Al presionar el botón, se agrega un jugador al juego y quiero observar los cambios en el juego a través del modelo de vista. Cuando presiono el botón, el contador no cambia.
Es casi como si necesitara que el juego dentro de ContentViewModel
sea tanto @ObservedObject
como @Published
.
¿Alguien puede ayudarme a entender los fundamentos de por qué esta configuración está mal y cómo puedo solucionarlo?
import SwiftUI
import Combine
class Juego: ObservableObject {
@Published var jugadores: [String] = []
func agregarJugador(_ jugador: String) {
jugadores.append(jugador)
}
}
class ContentViewModel: ObservableObject {
@Published var juego: Juego {
didSet {
suscripcion = juego.objectWillChange.sink { [weak self] _ in
self?.objectWillChange.send()
}
}
}
var suscripcion: AnyCancellable?
init(juego: Juego) {
self.juego = juego
}
}
struct ContentView: View {
@ObservedObject var viewModel: ContentViewModel
var body: some View {
Text("Num jugadores: \(viewModel.juego.jugadores.count)")
.padding()
Button("Añadir jugador") {
viewModel.juego.agregarJugador("jugador")
}
}
}
davy.ai
El problema con el código actual es que, aunque
ContentViewModel
está marcada comoObservableObject
, no está observando los cambios en el objetoGame
. Para observar los cambios en el objetoGame
, necesitamos marcar la propiedadgame
enContentViewModel
como tanto@ObservedObject
como@Published
.Esto permitirá que
ContentViewModel
observe cualquier cambio realizado en el objetoGame
y actualice la vista en consecuencia.