簡體   English   中英

如何使用 Button Tap 移動 SwiftUI 中的視圖或向 NavigationLink 添加操作?

[英]How to move Views in SwiftUI with Button Tap or add an action to NavigationLink?

我知道這個問題已經被問了一百萬次了,但無論如何我仍然找不到一個好的答案。

一直在使用 SwiftUI(剛剛開始)並使用現有代碼包括 Firebase 通過電話注冊/登錄。

流量是

  1. 顯示入職屏幕 (OnboardingStepView)
  2. 顯示電話輸入屏幕 (LoginView)
  3. 顯示電話號碼驗證 (VerificationView)
  4. 顯示捕獲更多用戶數據視圖 (RegisterView)
  5. Go 到主頁 (HomeView)

在我的第一個視圖(ContentView)中,我有以下代碼:

    struct ContentView: View {
    @AppStorage("log_Status") var status = false

    @State private var onboardinDone = false
    var data = OnboardingDataModel.data
    var body: some View {
        
        ZStack{
            Group {
                if !onboardinDone {
                    OnboardingViewPure(data: data, doneFunction: {
                        status = true
                        self.onboardinDone = true
                        
                        print("done onboarding")
                    })
                
            } else {
                
                NavigationView{
                    
                    VStack{
                        
                        if status{Home()}
                        else{Login()}
                    }
                    .preferredColorScheme(.dark)
                    .navigationBarHidden(true)
                }
            }
        }
    }
}
}

現在,所有視圖都已編碼並且可以正常工作(使用 Firebase),並且在以前的 Swift 版本中,當點擊按鈕時我會繼續。 但是,在 SwiftUI 中,這不是一個選項,您現在需要使用導航鏈接(可能看起來像一個按鈕)。

例如,在我的“ VerficationView ”中有一個執行操作的按鈕。

按鈕(操作:loginData.verifyCode){

現在,在點擊按鈕並在后台驗證數據后,我想移動到我創建的下一個視圖,該視圖注冊用戶的“姓名、簡歷和圖像”( RegisterView )。 此視圖工作並將用戶的數據注冊在 Firebase 中。 但是,一旦用戶單擊上述按鈕,我不知道如何正確呈現此屏幕。

  • 我是否將按鈕更改為導航鏈接,我可以向其中添加操作嗎?
  • 我是否使用@State 設置視圖的 state 和“isActive”來跟蹤顯示的內容?
  • 我是否使用“母視圖”並且該視圖始終跟蹤顯示的視圖?

請讓我知道您的想法,因為我被卡住了,不知道如何繼續....

謝謝!

我會將此作為評論發布,但我沒有足夠的聲譽。

我通過將登錄屏幕顯示為 a.fullScreenCover 解決了類似的問題。 這使它脫離了正常的導航層次結構,因此 ContentView 仍然是根視圖。 登錄完成后,通過 @Binding 更改 ContentView 中的 Bool。 這將更改 ContentView 的 state,因此現在 ifelse 可以將用戶發送到您的第一頁。

.fullScreenCover(isPresented: $isPresented) {

編輯:

也許不需要 FullScreenCover 只是else if 見下文。

struct ContentView: View {
    
    @State private var isOnboardinDone: Bool = false
    @State private var isLoggedIn: Bool = false
    
    var body: some View {
        if isOnboardinDone && isLoggedIn {
            FirstView()
        } else if !isOnboardinDone {
            OnboardingView(done: $isOnboardinDone)
        } else {
            LoginView(loggedIn: $isLoggedIn)
        }
        
    }
}
struct FirstView: View {
    var body: some View {
        Text("First")
    }
}

struct OnboardingView: View {
    @Binding var done: Bool
    var body: some View {
        Button(action: { done.toggle() }, label: {
            Text("On Boarding done.")
        })
    }
}
struct LoginView: View {
    @Binding var loggedIn: Bool
    var body: some View {
        Button(action: { loggedIn.toggle() }, label: {
            Text("Login")
        })
    }
}

暫無
暫無

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

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