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()
}
}
}
}
}
