[英]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 視圖中才支持它們,嘗試直接使用State 、 Binding或ObservableObject 。
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.