SwiftUI NavigationView 意外弹出到 Root

问题描述

我已经创建了一些 SwiftUI 代码,它使用 EnvironmentObject 来存储布尔值以返回到根视图,另一个 EnvironmentObject 来存储旨在跨多个视图使用的分数变量.

在这个例子中,我有两个游戏,一个红色游戏和一个蓝色游戏。我有最初设置为 .redStacked 的布尔值(.blueStackedfalse)。它们各自的 NavigationLinks 将它们设置为 true。在游戏结束时,“主页”按钮将其设置回 false,这会将导航堆栈展开回到根视图。

我遇到的问题是,对 score EnvironmentObject 的任何更新都会意外且过早地将导航堆栈弹出回根视图。

在下面的示例代码中,游戏之间的唯一区别是红色游戏按钮为其 score 环境变量增加了 +1。在这种情况下,添加一个点并执行指向最终页面的导航链接,但随后它立即返回到开头。 Blue Game 未按预期更新 score 环境变量和转换。

我欢迎任何有关为什么会发生这种情况的见解。提前致谢。

import SwiftUI

class Pop: ObservableObject {
    @Published var redStack = false
    @Published var blueStack = false
}
class score: ObservableObject {
    @Published var redTotal = 0
    @Published var bluetotal = 0
}

struct GameSelection: View {
    @Observedobject var pop = Pop()
    @Observedobject var score = score()
    
    var body: some View {
        NavigationView {
            vstack {
                NavigationLink(destination: RedStart(),isActive: $pop.redStack) {
                    Text("Play Red Game") //Tapping this link sets redStacked to true           
                }.foregroundColor(.red)
                
                Divider()
                
                NavigationLink(destination: BlueStart(),isActive: $pop.blueStack) {
                    Text("Play Blue Game") //Tapping this link sets blueSteacked to true
                }.foregroundColor(.blue)
            }
        }
        .environmentObject(score)
        .environmentObject(pop)
    }
}

struct RedStart: View {
    @State var goToNextView : Bool = false
    @EnvironmentObject var score : score
    var body: some View {
        vstack {
            NavigationLink(destination: RedEnd(),isActive: $goToNextView) {}
            Button(action: {
                score.redTotal += 1
                goToNextView = true
            },label: {
                Text("Add 1 Point. Move to Next Screen")
                    .foregroundColor(.red)
            })
        }
    }
}

struct BlueStart: View {
    @State var goToNextView : Bool = false
    @EnvironmentObject var score : score
    var body: some View {
        vstack {
            NavigationLink(destination: BlueEnd(),isActive: $goToNextView) {}
            Button(action: {
                //          score.bluetotal += 1
                goToNextView = true
            },label: {
                Text("Do NOT add points.  Move to Next Screen")
                    .foregroundColor(.blue)
            })
        }
    }
}

struct RedEnd: View {
    @EnvironmentObject var pop: Pop
    @EnvironmentObject var score: score
    var body: some View {
        
        Button(action: {
            pop.redStack = false
        },label: {
            vstack {
                Text("Your score: \(score.redTotal)")
                Text("Game Over")
                Image(systemName: "house.fill")
            }
            .foregroundColor(.red)
            
        })
    }
}

struct BlueEnd: View {
    @EnvironmentObject var pop: Pop
    @EnvironmentObject var score: score
    var body: some View {
        
        Button(action: {
            pop.blueStack = false
        },label: {
            vstack {
                Text("Your score: \(score.bluetotal)")
                Text("Game Over")
                Image(systemName: "house.fill")
            }.foregroundColor(.blue)
        })
    }
}

struct GameSelection_Previews: PreviewProvider {
    static var previews: some View {
        GameSelection()
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...