Как мне перейти от представления входа в систему к представлению вкладки в SwiftUI - PullRequest
0 голосов
/ 23 октября 2019

У меня есть экран входа в Google, а затем он должен перейти к TabView. Я попытался использовать ZStack, но он вызывает сбой приложения перед загрузкой каждой вкладки. На секунду появится кнопка входа, после чего появится правильная вкладка.

Есть ли способ полностью перейти на аналогичный ViewControllers? Или есть способ полностью удалить кнопку входа перед вызовом нового представления (MainView)?

MainView - это просто представление SwiftUI с tabView и tabItems.

У меня есть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()
        }
    }

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете оставить свой 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()
        }
    }
}
...