如何在 SwiftUI 中从登录视图过渡到 tabView
How do I transition from a login view to a tabView in SwiftUI
我有一个 Google 登录屏幕,然后它应该转换为 TabView。我尝试使用 ZStack,但它导致应用程序在加载每个选项卡之前出现故障。它会显示登录按钮一秒钟,然后会出现正确的选项卡。
有没有类似于 ViewControllers 的完全 segue 方法?或者有没有办法在我调用新视图 (MainView) 之前完全删除登录按钮?
MainView 只是一个带有 tabView 和 tabItems 的 SwiftUI 视图。
我有一个 SwiftUI SignInView:
import SwiftUI
import GoogleSignIn
struct SignInView: View {
@State var loggedIn = false
let logo = Image('googleLogo')
var body: some View {
ZStack {
Button(action: {
self.signIn {
self.loggedIn = true
}
}, label: {
VStack {
logo
.padding(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
.background(Color.white)
.cornerRadius(8.0)
.shadow(radius: 4.0)
Text("Sign-In")
.foregroundColor(.primary)
.multilineTextAlignment(.center)
.padding(5)
}
}).zIndex(-1)
if loggedIn {
MainView()
}
}
}
func signIn(completion: @escaping () -> Void) {
GIDSignIn.sharedInstance()?.presentingViewController = UIApplication.shared.windows.last?.rootViewController
GIDSignIn.sharedInstance()?.signIn()
DispatchQueue(label: "SignIn Check", qos: DispatchQoS.background).async(execute: { () -> Void in
while true {
if GIDSignIn.sharedInstance()?.currentUser != nil {
completion()
break
}
}
})
}
}
struct SignInView_Previews: PreviewProvider {
static var previews: some View {
SignInView()
}
}
您可以保持 ZStack
原样,并将登录按钮也作为条件按钮的一部分,以修复您看到的故障,但更简洁的解决方案是使用Group
而不是带有登录条件的 ZStack
:
var body: some View {
Group {
if !loggedIn {
Button(action: {
self.signIn {
self.loggedIn = true
}
}, label: {
VStack {
logo
.padding(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
.background(Color.white)
.cornerRadius(8.0)
.shadow(radius: 4.0)
Text("Sign-In")
.foregroundColor(.primary)
.multilineTextAlignment(.center)
.padding(5)
}
})
} else {
MainView()
}
}
}
我有一个 Google 登录屏幕,然后它应该转换为 TabView。我尝试使用 ZStack,但它导致应用程序在加载每个选项卡之前出现故障。它会显示登录按钮一秒钟,然后会出现正确的选项卡。
有没有类似于 ViewControllers 的完全 segue 方法?或者有没有办法在我调用新视图 (MainView) 之前完全删除登录按钮?
MainView 只是一个带有 tabView 和 tabItems 的 SwiftUI 视图。
我有一个 SwiftUI SignInView:
import SwiftUI
import GoogleSignIn
struct SignInView: View {
@State var loggedIn = false
let logo = Image('googleLogo')
var body: some View {
ZStack {
Button(action: {
self.signIn {
self.loggedIn = true
}
}, label: {
VStack {
logo
.padding(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
.background(Color.white)
.cornerRadius(8.0)
.shadow(radius: 4.0)
Text("Sign-In")
.foregroundColor(.primary)
.multilineTextAlignment(.center)
.padding(5)
}
}).zIndex(-1)
if loggedIn {
MainView()
}
}
}
func signIn(completion: @escaping () -> Void) {
GIDSignIn.sharedInstance()?.presentingViewController = UIApplication.shared.windows.last?.rootViewController
GIDSignIn.sharedInstance()?.signIn()
DispatchQueue(label: "SignIn Check", qos: DispatchQoS.background).async(execute: { () -> Void in
while true {
if GIDSignIn.sharedInstance()?.currentUser != nil {
completion()
break
}
}
})
}
}
struct SignInView_Previews: PreviewProvider {
static var previews: some View {
SignInView()
}
}
您可以保持 ZStack
原样,并将登录按钮也作为条件按钮的一部分,以修复您看到的故障,但更简洁的解决方案是使用Group
而不是带有登录条件的 ZStack
:
var body: some View {
Group {
if !loggedIn {
Button(action: {
self.signIn {
self.loggedIn = true
}
}, label: {
VStack {
logo
.padding(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
.background(Color.white)
.cornerRadius(8.0)
.shadow(radius: 4.0)
Text("Sign-In")
.foregroundColor(.primary)
.multilineTextAlignment(.center)
.padding(5)
}
})
} else {
MainView()
}
}
}