[英]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
,您有幾個選擇:
SwiftUI 原生樣式只是擁有一個包含您的視圖和其他視圖的父視圖。 您可以在共享ViewModel
上擁有一個屬性,並且父視圖可以根據視圖 model 的值返回不同的子視圖
以模態方式顯示新視圖(這是最簡單的)
使用 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.