我在 SwiftUI 中创建视图,在其中添加文本字段,该视图添加到主 SwiftUI 中,这些是视图模型。我想更改视图模型中的文本设置

问题描述 投票:0回答:1

当前我为登录活动执行了下面提到的这段代码,有一个我单独创建的自定义文本字段,并在主要内容中加载了两次,其名称为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 中构建的主屏幕,这是怎么可能的。

swiftui viewmodel swiftui-navigation
1个回答
0
投票

听起来你想要

TextFieldView
更新它传递的状态变量。这意味着将其作为绑定传递:

  • TextFieldView
    中,将
    enterText
    上的标签从
    @State
    更改为
    @Binding
@Binding var enterText: String
  • 此外,视图模型是在
    LoginTypeView
    中创建的,因此应将其标记为
    @StateObject
    而不是
    @ObservedObject
    :
@StateObject private var viewModel = LoginTypeViewModel()
© www.soinside.com 2019 - 2024. All rights reserved.