当前我为登录活动执行了下面提到的这段代码,有一个我单独创建的自定义文本字段,并在主要内容中加载了两次,其名称为logintypeview。第一个用于电子邮件,第二个用于密码。当用户在这些字段中输入值并单击登录时,我希望在视图模型中使用此值,但当我在视图模型中获取它时,它不会发生,即使用户输入值,这也是空值
这是我创建文本字段的第一个视图,当用户更改我想要在与主视图链接的视图模型中的文本时,在此文本字段中
struct TextFieldView: View {
var placeHolderName = "placeHolderName"
var textFieldName = "textFieldName"
var isPassword = false
@State var enterText: String
var body: some View {
VStack(alignment: .leading){
HStack{
Text(textFieldName)
.customFont(AppFont.SemiBold16!)
.foregroundColor(Color(AppColor.primaryColor))
Spacer()
}
.padding(.vertical,5)
HStack{
TextField("", text: $enterText)
.placeholder(when: enterText.isEmpty) {
Text(placeHolderName)
.foregroundColor(Color(AppColor.primaryColor))
.customFont(AppFont.Regular16!)
}
.foregroundColor(Color(AppColor.primaryColor))
.customFont(AppFont.Regular16!)
.hide(if: isPassword, withSpace: true)
SecureField("", text: $enterText)
.placeholder(when: enterText.isEmpty) {
Text(placeHolderName)
.foregroundColor(Color(AppColor.primaryColor))
.customFont(AppFont.Regular16!)
}
.textContentType(.password)
.foregroundColor(Color(AppColor.primaryColor))
.customFont(AppFont.Regular16!)
.hide(if: !isPassword, withSpace: true)
Spacer()
}
.frame(height: 40)
.padding(.horizontal,20)
.padding(.vertical,10)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color(AppColor.primaryColor), lineWidth: 1)
)
}
.padding(.horizontal,20)
}
}
struct LoginTypeView: View {
@ObservedObject private var viewModel = LoginTypeViewModel()
var body: some View {
VStack{
NavBarView(title: "Login")
ScrollView {
VStack() {
TextFieldView(placeHolderName: "Enter Email", textFieldName: "Email", enterText: $viewModel.emailInput)
TextFieldView(placeHolderName: "Enter Password", textFieldName: "Password", isPassword: true, enterText: $viewModel.passwordInput)
}
}
}
}
}
class LoginTypeViewModel: ObservableObject{
@Published var emailInput = ""
@Published var passwordInput = ""
var loginSuccesfully: (() -\> ())?
var loginFail: ((String) -\> ())?
}
当用户单击主视图中的登录按钮时,我希望更改视图模型,并且我希望 emailInput 和 passwordInput 中的值在 API 中发送这些值。 成功登录后我需要额外做一件事,我想移动到 UIKit 中构建的主屏幕,这是怎么可能的。
听起来你想要
TextFieldView
更新它传递的状态变量。这意味着将其作为绑定传递:
TextFieldView
中,将 enterText
上的标签从 @State
更改为 @Binding
:@Binding var enterText: String
LoginTypeView
中创建的,因此应将其标记为 @StateObject
而不是 @ObservedObject
:@StateObject private var viewModel = LoginTypeViewModel()