【问题标题】:TextField Value Going to be empty, SwiftUITextField Value 将是空的,SwiftUI
【发布时间】:2020-10-24 13:52:38
【问题描述】:

我正在使用 ObservableObject 来存储 textField 的值 这是我在 ObservableObject 中的代码

    class SignupViewModel: ObservableObject {
    @Published var fullname = ""
    @Published var birthday = ""
    @Published var email = ""
    @Published var password = ""
    @Published var birthDate = Date()
    @Published var isValidEmail = true
    @Published var isEmailAlreadyExist = false
    @Published var isPassword1 = true
    @Published var isPassword2 = true
    @Published var isDisable: Bool = false
}

我已经创建了这样的实例并使用了它们

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 5) {
                TextFieldWithoutValidation(text: $signupModel.fullname, placeHolder: "Full name", keyBoardType: .default)
                    .accentColor(Color.black)
                
//                LabelTextField(title: "Full name", text: $signupModel.fullname, keyboardType: .default, contentType: nil)
                
//                TextField("Full name", text: $data.value)
                Text("We’ll use this to issue you a cheque when you make a profit.")
                    .font(.system(size: 11.0))
            }
            DateView(titleText: "Birthday", date: $signupModel.birthDate, labelText: $signupModel.birthday)
            TextFieldWithoutValidation(text: $signupModel.email, placeHolder: "Email", keyBoardType: .emailAddress)
                .accentColor(Color.black)
            if !signupModel.isValidEmail {
                errorView(.emailNotValid)
            }
            SecureTextFieldWithoutValidation(text: $signupModel.password, placeHolder: "Password")
                .accentColor(Color.black)
            if !signupModel.password.isEmpty {
                VStack(spacing: 0) {
                    errorView((signupModel.isPassword1 ? .passwordRight1 : .passwordWrong1))
                    errorView((signupModel.isPassword2 ? .passwordRight2 : .passwordWrong2))
                }
            }
            createButton()
        }
        .padding(.leading, 20) // you can use as per your requirement(-16)
        .padding(.trailing, 20)
        .titleForNavigation("Create your account", displayMode: .large)
        .navigationLayout(AnyView(backButton))
    }

但是当我在 textField 中输入内容并转到下一个 textField 时,前一个 textField 文本将自动为空

有人可以帮忙解释一下为什么会这样

【问题讨论】:

  • 您应该在ViewTextFields 所在的位置提供更多代码。很难说是什么问题
  • 我已经更新了我的完整代码,你能帮帮我吗。

标签: ios swift swiftui


【解决方案1】:

我不确定这个答案是否有帮助,我能够在操场上复制您的示例。

对象似乎在渲染之间和按下“保存”按钮后保持其状态。

import PlaygroundSupport

class SignupViewModel: ObservableObject {
    @Published var fullname = ""
    @Published var birthday = ""
    @Published var email = ""
    @Published var password = ""
    @Published var birthDate = Date()
    @Published var isValidEmail = true
    @Published var isEmailAlreadyExist = false
    @Published var isPassword1 = true
    @Published var isPassword2 = true
    @Published var isDisable: Bool = false
}

struct ContentView: View {
    
    @ObservedObject var signupModel = SignupViewModel()
    
    var body: some View {
        VStack{
            Text("Sign up form")
            TextField("Name", text: $signupModel.fullname)
            TextField("Email", text: $signupModel.email)
            TextField("Password", text: $signupModel.password)
            Button(action: { print("Form data:"); print("\(signupModel.fullname) \(signupModel.email) \(signupModel.password)") }) {
                Text("Save")
            }
        }
    }
}

let viewController = UIHostingController(rootView: ContentView())

PlaygroundPage.current.liveView = viewController

【讨论】:

  • 在操场上,我没有看到您描述的问题,在文本字段之间切换会清除前一个文本字段。加上打印证明实例包含数据。如果你在操场上运行这段代码,你能看到吗?
  • 我查看了您更新的代码,但无法复制您的问题,因为代码缺少 LabelTextField、DateView、TextFieldWithoutValidation 和 SecureTextFieldWithoutValidation 的自定义视图,可能不需要查看 errorView。
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多