通过引用View中的函数传递@Published var



我正在一个注册屏幕上工作,该屏幕上有一个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()
}
}

最新更新