为什么以前的 SwiftUI 视图的一部分显示在新创建的视图上
Why is part of previous SwiftUI view showing on newly created view
我的应用程序的第一个初始视图是启动画面:
此屏幕包含检查 authToken
是否可用的代码,如果不可用,它将切换 showLogin
布尔值,这反过来会导致我的视图转到 LoginView()
.否则,如果有 authToken
可用,那么它会调用一个函数来获取有关用户的信息,将其存储在一个 Observable 对象中,然后将 showMain
bool 设置为 true,这又将我的视图更改为我的主屏幕。
它可以工作,但每当它改变视图时,它会将以前的视图放在新视图的底部。我知道我应该为此使用导航 link,但我无法让它按照我的逻辑正常工作,这是我得到的最接近的:
这是我的代码:
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
}
}
我的应用程序的第一个初始视图是启动画面:
此屏幕包含检查 authToken
是否可用的代码,如果不可用,它将切换 showLogin
布尔值,这反过来会导致我的视图转到 LoginView()
.否则,如果有 authToken
可用,那么它会调用一个函数来获取有关用户的信息,将其存储在一个 Observable 对象中,然后将 showMain
bool 设置为 true,这又将我的视图更改为我的主屏幕。
它可以工作,但每当它改变视图时,它会将以前的视图放在新视图的底部。我知道我应该为此使用导航 link,但我无法让它按照我的逻辑正常工作,这是我得到的最接近的:
这是我的代码:
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
}
}