Swift如何实现根据ObservableObject的score变量动态返回不同数组
问题原因
- 你在
myFunc内部单独实例化了GameSettings,和其他视图用的不是同一个实例,数据完全不互通 @StateObject是SwiftUI专为View属性设计的包装器,不能在普通函数内部声明,不会生效- View1中用
let固定初始化array,后续score变化不会触发array重新取值,视图不会更新
正确实现步骤
1. 调整myFunc逻辑,移除内部实例化的settings,改为通过参数传入当前score值
func myFunc(score: Int) -> [arrayModel] { if score == 1 { // 替换为score为1时的实际数组内容 return [arrayModel(example: example)] } else if score == 2 { // 替换为score为2时的实际数组内容 return [arrayModel(example: example)] } // 补充默认返回值避免编译报错 return [] }
2. 重写View1,注入全局共用的GameSettings实例,将array改为动态计算属性
struct View1: View { // 如果实例从父视图传入用@ObservedObject,若放在全局环境用@EnvironmentObject @ObservedObject var settings: GameSettings // 计算属性会在settings.score更新时自动重新计算,拿到对应数组 private var array: [arrayModel] { myFunc(score: settings.score) } var body: some View { VStack { Text("\(settings.score)") List { // 补充id参数避免遍历警告 ForEach(0..<array.count, id: \.self) { section in NavigationLink(destination: RowDetailView(array: array[section])) { RowView(array: array[section]) } } } } } }
3. 父视图调用时传入全局共用的GameSettings实例
你需要确保View1使用的GameSettings和其他页面是同一个实例,父视图调用示例:
// 父视图中保留全局的GameSettings实例 @StateObject private var globalSettings = GameSettings() // 展示View1时传入实例 View1(settings: globalSettings)
完成以上修改后,只要score值发生变化,就会触发View1刷新,自动调用myFunc拿到对应数组,视图内容会同步更新。
内容的提问来源于stack exchange,提问作者Carl Bryers
相关产品推荐
相关产品推荐

