Home > Blockchain >  How can i make a TextField validation work in SwiftUI?
How can i make a TextField validation work in SwiftUI?

Time:01-23

I have a little problem and I do not know how can I fix it .

I have a textfield, and when the textfield does not meet a certain criteria, I want to display a text underneath. All is working fine, except that the error text underneat is displayed just when the view is reloaded, like exit from the view and entering again.

I will put the code below so you can look at it :

struct EntryField: View {
    var placeHolder: String
    var prompt: String
    @Binding var field: String
    var body: some View {
        VStack(alignment: .leading) {
         TextField(placeHolder, text: $field).autocapitalization(.none)
            Text(prompt)
        }
    }
}
class VerifyFieldsViewModel : ObservableObject {
    
    @ObservedObject var coreDataViewModel = CoreDataViewModel()
    func isValid() -> Bool {
        guard coreDataViewModel.savedDetails.first?.firstName?.count ?? 0 > 0 else {
            return false
        }
        return true
    }
    
    var isFirstNameValid : String {
        if isValid() {
       return ""
        
        } else {
        return "Complete first name"
        }
    }
}
@available(iOS 15.0, *)
struct DeliveryView: View {
    @ObservedObject var verifyFieldsViewModel = VerifyFieldsViewModel()
    @StateObject var coreDataViewModel = CoreDataViewModel()
    var body: some View {
        let firstName = Binding(
            get: {coreDataViewModel.savedDetails.first?.firstName ?? ""},
            set: {coreDataViewModel.savedDetails.first?.firstName = $0})

        ScrollView {
            VStack(alignment: .leading) {
               
                    Text("Nume")
                        .foregroundColor(.orange)
                    EntryField(placeHolder: "Popescu", prompt: verifyFieldsViewModel.isFirstNameValid , field: firstName)
                        .onSubmit {
                            coreDataViewModel.saveContext()
                        }
        }
       
    }
}
}

That's the code. Hope you can help me with this problem. Thank you !!

CodePudding user response:

Well since you need to frequently update the error message then your prompt property in EmptyField should be Binding, otherwise you'll need to refresh the view.

@Binding var prompt: String

Or you can directly use the model in EmptyField, full code:

struct EntryField: View {
    var placeHolder: String
    @ObservedObject var verifyFieldsViewModel: VerifyFieldsViewModel //edited here
    @Binding var field: String
    var body: some View {
        VStack(alignment: .leading) {
            TextField(placeHolder, text: $field).autocapitalization(.none)
            Text(verifyFieldsViewModel.isFirstNameValid) //edited here
        }
    }
}

class VerifyFieldsViewModel : ObservableObject {
    @ObservedObject var coreDataViewModel = CoreDataViewModel()
    func isValid() -> Bool {
        guard coreDataViewModel.savedDetails.first?.firstName?.count ?? 0 > 0 else {
            return false
        }
        return true
    }
    var isFirstNameValid : String {
        if isValid() {
            return ""
        }else {
            return "Complete first name"
        }
    }
}

@available(iOS 15.0, *)
struct DeliveryView: View {
    @ObservedObject var verifyFieldsViewModel = VerifyFieldsViewModel()
    @StateObject var coreDataViewModel = CoreDataViewModel()
    var body: some View {
        let firstName = Binding(
            get: {coreDataViewModel.savedDetails.first?.firstName ?? ""},
            set: {coreDataViewModel.savedDetails.first?.firstName = $0})
        ScrollView {
            VStack(alignment: .leading) {
                Text("Nume")
                    .foregroundColor(.orange)
                EntryField(placeHolder: "Popescu", verifyFieldsViewModel: verifyFieldsViewModel, field: firstName) //edited here
                    .onSubmit {
                        coreDataViewModel.saveContext()
                    }
            }
        }
    }
}
  •  Tags:  
  • Related