簡體   English   中英

SwiftUI 查看文本字段未綁定到 ViewModel 屬性

[英]SwiftUI View textfield not binding to ViewModel properties

我正在使用 NavigationView 創建用戶注冊。 用戶輸入 email,然后他們必須輸入用戶名、密碼等。

用戶輸入文本后,導航鏈接將變為活動狀態,因此他們可以繼續下一個視圖並輸入更多詳細信息。

但是輸入的數據沒有與 ViewModel 中的屬性綁定,我為 NavigationView 堆棧中的所有數據輸入視圖使用一個 ViewModel。

為什么 SignupViewModel 中的屬性沒有綁定/保存? 我知道它們不是因為我在點擊 NavigationLink 后嘗試打印它們......

謝謝!


// ViewModel for all views in the stack

class SignupViewModel: ObservableObject {

   var email = ""
   var username = ""
   var password = ""
   var reconfirmPassword = ""

   func sendEmailCode() { } // sends secret code to email for verification
  
}

// 1st view in NavigationView stack

struct SignupEmailView: View {

    @ObservedObject var signupViewModel = SignupViewModel()

    var emailContinueDisabled: Bool {
        signupNavigationViewModel.email.isEmpty
    }
    
    var body: some View {

        NavigationView {

            VStack {

                HStack {

                    Image(systemName: EMAIL_ICON)
                        
                    TextField("enter your e-mail", text: $signupNavigationViewModel.email )
                    .autocapitalization(.none)
                }
                    .modifier(DetailsTextFieldModifier())

                NavigationLink("continue", destination: ConfirmCodeView())
                    .disabled(emailContinueDisabled)

                Spacer() 
            }
        }.navigationBarBackButtonHidden(true)
        .navigationBarHidden(true)
      }
  }

// 2nd view in NavigationView stack

struct ConfirmCodeView: View {

    @ObservedObject var signupNavigationViewModel = SignupNavigationViewModel()
   
    var codeContinueDisabled: Bool {
        signupNavigationViewModel.emailCode.isEmpty
    }
    
    var body: some View {

            VStack {

            TextField("Enter code sent to your email", text: $signupNavigationViewModel.emailCode)

            NavigationLink("confirm", destination: SignupUsername())
           .disabled(codeContinueDisabled)

            Spacer()

            }.navigationBarBackButtonHidden(true)
        
   
    }
    
}

您正在使用計算屬性,直到今天在 SwiftUI 視圖中才支持它們,嘗試直接使用StateBindingObservableObject


struct SignupEmailView: View {
    
    @StateObject var signupViewModel = SignupViewModel()

    var body: some View {

        NavigationView {

            VStack {
                
                HStack {
                    
                    Image(systemName: EMAIL_ICON)
                        
                    TextField("enter your e-mail", text: $signupViewModel.email)
                      .autocapitalization(.none)  
   
                }
                .modifier(DetailsTextFieldModifier())

                NavigationLink("continue", destination: ConfirmCodeView())
                  .disabled(signupViewModel.email.isEmpty) // <<: Here

                Spacer()

            }
        }
        .navigationBarBackButtonHidden(true)
        .navigationBarHidden(true)
      }
  }

struct ConfirmCodeView: View {
    
    @StateObject var signupNavigationViewModel = SignupNavigationViewModel()

    var body: some View {

            VStack {

            TextField("Enter code sent to your email", text: $signupNavigationViewModel.emailCode)

            NavigationLink("confirm", destination: SignupUsername())
             .disabled(signupNavigationViewModel.emailCode.isEmpty)  // <<: Here

            Spacer()

            }
            .navigationBarBackButtonHidden(true)


    }

}

暫無
暫無

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

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