【问题标题】:SwiftUI hide TabView when clicking Logout with FirebaseSwiftUI 在使用 Firebase 单击注销时隐藏 TabView
【发布时间】:2021-02-11 09:05:56
【问题描述】:

我是一个带有 Firebase 登录/注销的简单应用。登录完美运行,当我注销 LoginView 时,我的应用程序显示出来,但问题是 TabView 仍然存在,您可以导航到另一个选项卡。那么应该发生什么:标签栏应该是不可见/隐藏的,或者我的 LoginView 应该出现在其他所有内容之上。

ContentView.swift

    var body: some View {
        if Auth.auth().currentUser == nil {
            LoginView()
        }
        else {
            AppView()
        }
    }

AppView.swift

var body: some View {
    TabView {
        PlacesView()
            .tabItem {
                Image(systemName: "mappin.and.ellipse")
                Text("Places")
            }
        MeetupsView()
            .tabItem {
                Image(systemName: "person.3")
                Text("Meetups")
            }
        ProfileView()
            .tabItem {
                Image(systemName: "person.crop.circle")
                Text("Profile")
            }
        SettingsView()
            .tabItem {
                Image(systemName: "gear")
                Text("Settings")
            }
    }
}

LoginView.swift

@State var signInSuccess = false

var body: some View {
    return Group {
        if signInSuccess {
            AppView()
        }
        else {
            LoginFormView(signInSuccess: $signInSuccess)
        }
    }
}

设置退出

NavigationView {
            if !signedIn {
                ContentView()
                    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
                    .background(Color.red)
                    .edgesIgnoringSafeArea(.all)
            }
            else {
            List {
    Button(action: {
                    do {
                      try Auth.auth().signOut()
                        signedIn.toggle()
                    } catch let signOutError as NSError {
                      print ("Error signing out: %@", signOutError)
                    }
                    
                }){
                Text("Sign out")
                    .fontWeight(.light)
                        .foregroundColor(Color.red)
                        .frame(maxWidth: .infinity, alignment: .center)
                    .font(/*@START_MENU_TOKEN@*/.title2/*@END_MENU_TOKEN@*/)
                }
          }
     }

看起来像

【问题讨论】:

    标签: firebase swiftui


    【解决方案1】:

    您的ContentView 不知道会触发对视图层次结构的更新,因为目前它无法理解 Auth.auth().currentUser 在用户注销时更改了值。

    一种解决方案是使用 @ObservableObject 和 Firebase 的身份验证状态侦听器为您处理此问题:

    class AuthManager : ObservableObject {
        @Published var isLoggedIn = false
        
        private var authStateHandle: AuthStateDidChangeListenerHandle?
        
        init() {
            authStateHandle = Auth.auth().addStateDidChangeListener { _, user in
                self.isLoggedIn = user != nil
            }
        }
    }
    

    然后,在 ContentView 中:

    struct ContentView : View {
      @ObservedObject authManager = AuthManager()
      var body : some View {
        if authManager.isLoggedIn {
          AppView()
        } else {
          LoginView()
        }
      }
    }
    

    Firebase 提供的身份验证状态侦听器句柄的好处是它自动处理连接到全局 Auth() 实例,因此您甚至无需担心将其连接到您的登录或注销功能。这意味着您可能可以删除登录视图上的 signInSuccess 布尔检查,因为现在将在 ContentView 级别处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多