簡體   English   中英

如何在 swiftUI 中登錄后顯示視圖

[英]How to show view after login view in swiftUI

在我的應用程序中,我從 LoginView 開始,它對后端進行 API 調用以進行身份驗證。 如果這是成功的(在完成處理程序中,我想顯示 FeedView()。使用 UIKit 這一切都非常簡單,試圖弄清楚如何使用 SwiftUI 做到這一點。那么我如何以編程方式顯示新視圖(我不'沒有導航視圖)?

您可以有這樣的條件視圖:

struct MakeSureUserIsLoggedInView: View {
  @State private var loggedIn = false
  var body: some View {
    if loggedIn {
      FeedView()
    } else {
      LoginView { // your login view with completion handler
        loggedIn = true
      }
    }
  }
}

注意我們如何使用@State在顯示的視圖之間切換。

如果您不想使用NavigationView ,您有幾個選擇:

  1. SwiftUI 原生樣式只是擁有一個包含您的視圖和其他視圖的父視圖。 您可以在共享ViewModel上擁有一個屬性,並且父視圖可以根據視圖 model 的值返回不同的子視圖

  2. 以模態方式顯示新視圖(這是最簡單的)

  3. 使用 UIKit 導航 - 這是我在復雜應用程序中的首選方法,您可以使用 UIViewControllers 簡單地在應用程序中導航,並將 SwiftUI 視圖固定到邊緣

如果您願意,我可以 go 更詳細地了解其中任何一個,以及我自己項目中的一些示例代碼。 對於 SwiftUI 來說,選項 1 可能是最自然的,如果您使用此選項,您甚至可以使用matchedGeometryView之類的東西很好地為過渡設置動畫。

您可以使用 EnvironmentObject 來控制您的用戶 Session,以下示例使用 Firebase 身份驗證。 注意你需要在你的父視圖中添加一個 environmentObject 。

主要的:

import SwiftUI
import Firebase

@main
struct YourApp: App {

@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

var body: some Scene {
    WindowGroup {
        ContentView().environmentObject(SessionManager.shared)
    }
}

//Firebase init
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication,   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        return true
      }
}
}

ContentView:訪問您的環境變量

struct ContentView: View {

@EnvironmentObject var session: SessionManager

var body: some View {
    
    Group {
        if session.loggedUser != nil {
            FeedView()
        }
        else {
            LoginView()
        }
}
}

示例 Session 管理器(Firebase 示例,如果您有另一個后端,則需要添加邏輯)。 然后可以在應用程序中的任何位置調用注銷,此操作更改 ContentView State 並顯示 LoginView:

import Foundation
import SwiftUI
import Firebase

class SessionManager: NSObject, ObservableObject {
    
    @Published var loggedUser: User?
    static let shared = SessionManager()
    private let auth = Auth.auth()
    
    var handle : AuthStateDidChangeListenerHandle?
    
    override private init() {
        loggedUser = auth.currentUser
        super.init()
        handle = auth.addStateDidChangeListener(authStateChanged)
    }
    
    private func authStateChanged(with auth: Auth, user: User?) {
        guard user != self.loggedUser else { return }
        self.loggedUser = user
    }
        
    func logout() {
        do {
            try Auth.auth().signOut()
        } catch(let error) {
            debugPrint(error.localizedDescription)
        }
    }
    
    func unbind() {
        if let handle = handle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }
    
    deinit {
        unbind()
    }
    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM