由于某些原因,当我更改来自另一个视图的值时,它似乎不会更新主视图上的值.数据存储在一个可观察的对象中,数组被发布,所以我不确定是什么问题.

我希望更改这些值以匹配数据数组中的值(如下所列).

以下是数据的存储方式

import Foundation
import SwiftUI

struct PlayerData: Identifiable {
    let id: Int
    let name: String
    var balance: Int
    let iconname: String
    var active: Bool
    let accentColor: Color
}

class PlayerDataViewModel: ObservableObject {
    @Published var PlayerDataList: [PlayerData] = [
        PlayerData(id: 0, name: "Player1", balance: 1500, iconname: "car.side.fill", active: true, accentColor: .red),
        PlayerData(id: 1, name: "Player2", balance: 1500, iconname: "ferry.fill", active: true, accentColor: .green),
        PlayerData(id: 2, name: "Player3", balance: 1500, iconname: "airplane", active: true, accentColor: .green),
        PlayerData(id: 3, name: "Player4", balance: 1500, iconname: "fan.ceiling.fill", active: true, accentColor: .white)
    ]
}

下面是显示这些值的主视图代码

import SwiftUI

struct MainScreenView: View {
    @ObservedObject var viewModel:PlayerDataViewModel
    @Binding var SelectedPlayerIndex: Int
    
    var body: some View {
        NavigationView {
            VStack {
                Text("Game")
                    .font(.largeTitle)
                    .fontWeight(.bold)
                
                HStack {
                    NavigationLink(destination: FocusedBalanceView(SelectedPlayerIndex: 0, viewModel: PlayerDataViewModel())) {
                        VStack(spacing: 10) {
                            Text("Values")
                                .font(.title2)
                                .fontWeight(.semibold)
                                .foregroundColor(.white)
                            
                            HStack {
                                VStack(spacing: 10) {
                                    ForEach(viewModel.PlayerDataList) { item in
                                        if(item.active == true) {
                                            Image(systemName: item.iconname)
                                                .foregroundColor(item.accentColor)
                                        }
                                    }
                                }
                                
                                VStack(spacing: 10) {
                                    ForEach(viewModel.PlayerDataList) { item in
                                        if(item.active == true) {
                                            Text("\(item.balance)")
                                                .foregroundColor(.white)
                                        }
                                    }
                                }
                            }
                        }
                        .padding()
                        .background(.ultraThinMaterial)
                        .cornerRadius(8)
                    }
                }
            }
        }
        .navigationBarBackButtonHidden(true)
    }
}

编辑:这是更改主视图中的值的代码

import SwiftUI

struct FocusedBalanceView: View {
    @State var SelectedPlayerIndex: Int
    @ObservedObject var viewModel: PlayerDataViewModel

    var body: some View {
        VStack {
            Form {
                Section(header: Text("Balance")) {
                    Picker("Balance", selection: $SelectedPlayerIndex) {
                        Text("").tag("")
                        
                        ForEach(viewModel.PlayerDataList) { item in
                            if item.active == true {
                                HStack {
                                    Text("\(item.name)").tag("\(item.id)")
                                    
                                    Image(systemName: "\(item.iconname)")
                                }
                            }
                        }
                    }
                }
            }
            .frame(height: 280)
            
            VStack {
                Text("Current Balance")
                    .font(.title3)
                    .fontWeight(.semibold)
                
                Text("\(viewModel.PlayerDataList[SelectedPlayerIndex].balance)")
                    .font(.title2)
                    .fontWeight(.bold)
            }
            .padding()
            .background(.ultraThinMaterial)
            .cornerRadius(8)
            
            VStack {
                
                Text("Actions")
                    .font(.title2)
                    .fontWeight(.semibold)
                
                HStack {
                    Button(action: {
                        viewModel.PlayerDataList[SelectedPlayerIndex].balance += 500
                    }) {
                        Image(systemName: "car")
                            .frame(width: 70, height: 70)
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .font(.title)
                            .background(.green)
                            .clipShape(Circle())
                    }
                    
                    Button(action: {
                        viewModel.PlayerDataList[SelectedPlayerIndex].balance -= 500
                    }) {
                        Image(systemName: "dollarsign")
                            .frame(width: 70, height: 70)
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .font(.title)
                            .background(.red)
                            .clipShape(Circle())
                    }
                    
                    Button(action: {
                        viewModel.PlayerDataList[SelectedPlayerIndex].balance -= 250
                    }) {
                        Image(systemName: "mappin.and.ellipse")
                            .frame(width: 70, height: 70)
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .font(.title)
                            .background(.blue)
                            .clipShape(Circle())
                    }
                }
            }
            .padding()
            .background(.ultraThinMaterial)
            .cornerRadius(8)
        }
    }
}

希望这已经足够了,如果还不够,那就告诉我.

推荐答案

目前,您正在NavigationLink中创建一个全新的PlayerDataViewModel实例.因此,在new视图模型中更改的数据不会反映在用户界面的其余部分中.您应该传递对已有实例的引用:

FocusedBalanceView(SelectedPlayerIndex: 0, viewModel: viewModel)

此外,与您的问题无关,但您可能希望考虑采用SWIFT中的标准命名约定,包括使用小写字母作为参数和变量的第一个字符.

Swift相关问答推荐

如何使用快速宏用来自函数的关联值来初始化枚举?

在运行时检测蒸汽工人的类型

try 在小部件内部读取核心数据的SwiftUI总是返回空吗?

使用MKLocalSearch获取坐标

如何在枚举有关联数据时使用combined if with case

在Swift中如何用变量计算0.9的立方

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

如何从 Swift 中隐藏 Objective-C 类接口的一部分?

将每个枚举 case 与 Swift 中的一个类型相关联

获取具有关联类型的协议的self

swiftui更改显示的 Select 器值

如何有条件地格式化 SwiftUI 代码

Subclass.fetchRequest() Swift 3.0,扩展并没有真正帮助 100%?

Swift - 获取本地日期和时间

3D touch /强制touch 实现

快速延迟加载属性

如何快速将弹出框调整为表格视图中内容的大小?

Swift 中的 recursiveDescription 方法?

swift中的匿名类

Xcode6 中的 Swift 类与 Cocoa Touch 类