我正在一个注册屏幕上工作,该屏幕上有一个ViewModel。
ViewModel只是一个扩展我的注册屏幕类的类,我在其中放置了所有的业务逻辑。
extension RegistrationScreen {
@MainActor class ViewModel : ObservableObject {
//business logic goes here
}
}
ViewModel有@Published变量来表示屏幕中每个文本字段的两种状态:text和validationText。
@Published var first: String = ""
@Published var firstValidationMessage: String = ""
在该ViewModel中,我从另一个类调用了一个助手函数,该函数检查字段的文本是否为空,如果为空,它可以将字段验证文本设置为错误,如下所示:
class FieldValidation: Identifiable {
func isFieldEmptyAndSetError(fieldText:String, fieldValidationText:Binding<String>) -> Bool {
if(fieldText.isEmpty){
fieldValidationText.wrappedValue = "Required"
return true
}else{
fieldValidationText.wrappedValue = ""
return false
}
}
}
要从我的viewModel调用该函数,我需要执行以下操作:
FieldValidation().isFieldEmptyAndSetError(fieldText:first,fieldValidationText: firstValidationMessage)
这引发了运行时错误,对我来说很难解密,因为我是Xcode和iOS的新手。
我的问题是,我如何才能通过参考来完成这项工作?或者,如果我做的方式不可能,请解释发生了什么。
函数接收@Published
作为参数有点奇怪,如果你想处理viewModel中的所有验证,这似乎是Combine
的一个简单解决方案。如果字符串为空,我建议您创建一个扩展来验证,因为.isEmpty
不会修剪文本。
类
class FieldValidation: Identifiable {
static func isFieldEmptyAndSetError(fieldText:String) -> String {
return fieldText.isEmpty ? "Required" : ""
}
}
视图模型
import Foundation
import Combine
class viewModel: ObservableObject {
@Published var text1 = ""
@Published var text2 = ""
@Published var text3 = ""
@Published var validationText1 = ""
@Published var validationText2 = ""
@Published var validationText3 = ""
init() {
self.$text1.map{newText in FieldValidation.isFieldEmptyAndSetError(fieldText: newText)}.assign(to: &$validationText1)
self.$text2.map{newText in FieldValidation.isFieldEmptyAndSetError(fieldText: newText)}.assign(to: &$validationText2)
}
func validateText(value: String) {
self.validationText3 = FieldValidation.isFieldEmptyAndSetError(fieldText: value)
}
}
视图如下:
import SwiftUI
struct ViewDate: View {
@StateObject var myviewModel = viewModel()
var body: some View {
VStack{
Text("Fill the next fields:")
TextField("", text: $myviewModel.text1)
.border(Color.red)
Text(myviewModel.validationText1)
TextField("", text: $myviewModel.text2)
.border(Color.blue)
Text(myviewModel.validationText2)
TextField("", text: $myviewModel.text3)
.border(Color.green)
.onChange(of: myviewModel.text3) { newValue in
if(newValue.isEmpty){
self.myviewModel.validateText(value: newValue)
}
}
Text(myviewModel.validationText3)
}.padding()
}
}