swift - 如何在 SwiftUI 中从登录 View 转换为 tabView

标签 swift xcode transition swiftui swift5

我有一个 Google 登录屏幕,然后它应该转换为 TabView。我尝试使用 ZStack,但它导致应用程序在加载每个选项卡之前出现故障。它将显示登录按钮一秒钟,然后会出现正确的选项卡。

有没有一种方法可以像ViewControllers一样完全segue?或者有没有办法在调用新 View (MainView)之前完全删除登录按钮?

MainView 只是一个带有 tabView 和 tabItems 的 SwiftUI View 。

我有一个 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()
        }
    }
}

关于swift - 如何在 SwiftUI 中从登录 View 转换为 tabView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58514133/

相关文章:

xcode - 复制/粘贴时 View Controller 变小(Xcode 7、Swift 2)

ios - 带有左右栏项目的中心导航栏标题?

xcode - 安装 GLEW 并将其与 Xcode 一起使用

ios - 找不到 dyld 符号 DictionaryGenerator (IOS Xcode6 Beta4)

javascript - 如何使用 javascript 将属性从设置属性转换为新属性

ios - LNPopupController : The popup controller is already in transition. 将忽略此转换请求

ios - UITesting 获取事件应用程序列表失败

ios - 为什么这些约束在动画时似乎滞后?

ios - 如果按钮在 NSObject 中定义,则按钮 @selector 不起作用

css - 影响单独 div 的过渡