我正在處理一個附有 ViewModel 的注冊螢屏。
ViewModel 只是一個擴展我的注冊螢屏類的類,我將所有業務邏輯都放在其中。
extension RegistrationScreen {
@MainActor class ViewModel : ObservableObject {
//business logic goes here
}
}
ViewModel 有@Published 變數來表示螢屏中每個文本欄位的兩種狀態:文本和驗證文本。
@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 的新手。
我的問題是,我怎樣才能通過參考作業來獲得這個傳遞?或者,如果我正在做的方式是不可能的,請解釋發生了什么。
uj5u.com熱心網友回復:
有一個接收 a@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 validationText1 = ""
@Published var validationText2 = ""
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)
}
}
視圖如下所示:
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)
}.padding()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450992.html
