When I modify the score using the stepper on View1 it successfully updates the score on View1.ViewModel. However when I dismiss the sheet it does not update the score on the players section.
I know that you can set @Binding var on Player1 but how do I pass this down to the View1.ViewModel so that when it makes changes it updates the parent view?
ContentView
import SwiftUI
struct ContentView: View {
@State var game: Game = Game(name: "Game #1")
@State var isPresented: Bool = true
var body: some View {
NavigationView {
List {
Section(header: Text("PLAYERS"), content: {
ForEach(game.players) { player in
HStack {
Text(player.name)
Spacer()
Text("\(player.score)")
}
}
})
}
.navigationTitle(game.name)
}
.sheet(isPresented: $isPresented, onDismiss: {}, content: {
TabView {
ForEach(game.players) { player in
View1(player: player)
}
}
.tabViewStyle(PageTabViewStyle())
})
.onAppear(perform: {
for p in 1...3 {
let player = Player(name: "Player #\(p)")
self.game.players.append(player)
}
})
}
}
struct View1: View {
@ObservedObject var vm: View1.ViewModel
init(player: Player) {
vm = ViewModel(player: player)
}
var body: some View {
VStack {
Spacer()
Text(vm.name)
Divider()
Group {
Stepper("Earned Points: \(vm.earnedPoints)", value: $vm.earnedPoints, in: 0...50)
}
.padding(.horizontal)
Spacer()
}
}
}
extension View1 {
class ViewModel: ObservableObject {
@Published private var player: Player
@Published private var round: Round
init(player: Player) {
self.player = player
self.round = player.rounds[0]
}
var name: String {
return player.name
}
var earnedPoints: Int {
get {return self.round.earnedPoints}
set {self.round.earnedPoints = newValue}
}
}
}
Game
import SwiftUI
struct Game: Identifiable {
init(name: String) {
self.name = name
}
var id: UUID = UUID()
var name:String
var players: Array<Player> = Array<Player>()
var isMastersEdition: Bool = false
}
Player
import SwiftUI
struct Player: Identifiable {
init(name: String) {
self.name = name
}
var id: UUID = UUID()
var name:String
var rounds: Array<Round> = [Round()]
var score: Int {
return self.rounds.map({$0.earnedPoints}).reduce(0, +)
}
}
Round
import SwiftUI
struct Round: Identifiable {
var id: UUID = UUID()
var earnedPoints: Int = 0
var completedPhase: Bool = false
var selectedPhase: Int = 0
}