为什么以前的SwiftUI视图的一部分显示在新创建的视图上

为什么以前的SwiftUI视图的一部分显示在新创建的视图上,swift,uiview,swiftui,swiftui-navigationlink,Swift,Uiview,Swiftui,Swiftui Navigationlink,我的应用程序的第一个初始视图是启动屏幕: 此屏幕有代码来检查authToken是否可用,如果不可用,则会切换showLoginbool,从而使我的视图转到LoginView()。否则,如果有可用的authToken,则它调用一个函数,该函数获取有关用户的信息,将其存储在可观察对象中,然后将showMainbool设置为true,从而将我的视图更改为我的主屏幕 它可以工作,但无论何时更改视图,都会将上一个视图放在新视图的底部。我知道我应该为此使用导航链接,但我无法让它与我的逻辑正常工作,这是我得

我的应用程序的第一个初始视图是启动屏幕:

此屏幕有代码来检查
authToken
是否可用,如果不可用,则会切换
showLogin
bool,从而使我的视图转到
LoginView()
。否则,如果有可用的
authToken
,则它调用一个函数,该函数获取有关用户的信息,将其存储在可观察对象中,然后将
showMain
bool设置为true,从而将我的视图更改为我的主屏幕

它可以工作,但无论何时更改视图,都会将上一个视图放在新视图的底部。我知道我应该为此使用导航链接,但我无法让它与我的逻辑正常工作,这是我得到的最接近的:

这是我的代码:

struct Splash: View {

let keychain = KeychainSwift()

@EnvironmentObject var user: userData

@State var showLogin = false
@State var showMain = false

var body: some View {
    NavigationView{
        VStack{
            if(showLogin){
                LoginView()
            }
            if(showMain){
                Main()
            }
            Text("Splash Screen")
                .onAppear(){
                    if(checkLogin()){
                        let authToken = keychain.get("authToken")
                        getDataAPI().getUserData(authToken: authToken!, completion: { response, error in
                            print("Starting")
                            if(error == nil){
                                let code = response!["code"] as? String
                                if(code == "100"){
                                    print("Done")
                                    DispatchQueue.main.async {
                                        user.email = response?["email"] as! String
                                        user.uid = response?["uid"] as! String
                                        user.username = response?["username"] as! String
                                    }
                                    showMain.toggle()
                                }else{
                                    print(error!)
                                }
                            }
                        })
                    }else{
                        showLogin.toggle()
                    }
                }
        }
    }
}
} 

因为它们都在
VStack
中,即一个比另一个低。要解决这个问题,必须明确地从视图层次结构中删除初始视图,如

VStack{
    if(showLogin){
        LoginView()
    }
    if(showMain){
        Main()
    }
    if !showLogin && !showMain {
       Text("Splash Screen")
         // ... other your code
    }
}

我使用
onAppear
来运行代码,如果没有当前的启动视图,我将无法运行任何代码,因为错误
Type'()'无法与'view'一致;只有结构/枚举/类类型可以符合协议