簡體   English   中英

SwiftUI - 刪除 NavigationView?

[英]SwiftUI - Removing a NavigationView?

我的入職流程的根視圖有一個 NavigationView。 我的應用程序的根視圖是一個登錄頁面,其中還包含一個 NavigationView。 這意味着當有人第一次啟動應用程序時,他們將通過入職流程 go 並登陸登錄屏幕 - 從而在導航視圖中生成導航視圖。

有沒有辦法重置視圖堆棧或在必要時簡單地刪除額外的導航視圖?


這就是我在下面實現@New Dev 解決方案的方式。 首先是塔 class。 (這個名字幫助我想象它是一個 ObservableObject 的事實。)它的工作是跟蹤 currentPage 並讓感興趣的視圖知道它什么時候發生了變化。
 import Foundation import SwiftUI import Combine class Tower: ObservableObject { enum Views { case onboarding, login, dashboard } let objectWillChange = PassthroughSubject<Tower, Never>() @Published var currentPage: Views =.onboarding { didSet { objectWillChange.send(self) } } }

接下來是 ConductorView。 當 currentPage 發生變化時,Tower 會通知它,並加載相應的視圖。

 struct ConductorView: View { @EnvironmentObject var tower: Tower var body: some View { VStack { if tower.currentPage ==.onboarding { ContentViewA() } else if tower.currentPage ==.login { ContentViewB() } } } }

最后是內容視圖。

 struct ContentViewA: View { @EnvironmentObject var tower: Tower var body: some View { Button(action: { self.tower.currentPage =.login }) { Text("Go to Login") } } } }

除了 New Devs 非常感謝的解決方案外,我還使用了 BLCKBIRDS 的這篇文章

我將擴展我的評論。 NavigationView / NavigationLink不是更改視圖的唯一方法 - 也可以使用簡單的條件來確定呈現哪個視圖。

因此,假設您有一些 class 包含登錄/入職信息的 state:

class AppState: ObservableObject {
   enum UserFlow { 
      case onboarding, login, home
   }
   @Published var userFlow: UserFlow = .onboarding
   // ...
}

然后您的RootView可以確定要顯示的用戶流:

struct RootView: View {

   @EnvironmentObject var appState: AppState

   var body: some View {
      if appState.userFlow == .onboarding {
         OnboardingRootView()
      } else if appState.userFlow == .login {
         LoginRootView()
      } else {
         ContentView()
      }
   }
}

暫無
暫無

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

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