Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加ViewModel后,SwiftUI视图不更新按钮切换_Swift_Swiftui - Fatal编程技术网

添加ViewModel后,SwiftUI视图不更新按钮切换

添加ViewModel后,SwiftUI视图不更新按钮切换,swift,swiftui,Swift,Swiftui,我正在为我的应用程序的用户制作一个注册表单。在表格中,我有两个开关。一个是滑块,另一个是复选框。当我在视图中声明了所有变量时,我能够使这两个切换正常工作,并且视图能够完美地更新 我对项目进行了重构,将一些函数和错误检查移动到ViewModel中。现在,我的切换不再更新视图,但它们切换的布尔值正在更改值 虽然我可以把所有的东西都塞进视图中,但我的偏好是找出为什么这不起作用,以及最好的方法是什么。例如,我不理解输入字段如何更新视图模型,但切换不会 以下是我的ViewModel: import Fou

我正在为我的应用程序的用户制作一个注册表单。在表格中,我有两个开关。一个是滑块,另一个是复选框。当我在视图中声明了所有变量时,我能够使这两个切换正常工作,并且视图能够完美地更新

我对项目进行了重构,将一些函数和错误检查移动到ViewModel中。现在,我的切换不再更新视图,但它们切换的布尔值正在更改值

虽然我可以把所有的东西都塞进视图中,但我的偏好是找出为什么这不起作用,以及最好的方法是什么。例如,我不理解输入字段如何更新视图模型,但切换不会

以下是我的ViewModel:

import Foundation

class SignUpViewModel: ObservableObject {

@Published

var email: String = ""
var companyName: String = ""
var username: String = ""
var firstName: String = ""
var lastName: String = ""
var password: String = ""
var passwordConfirmation: String = ""
var phoneNumber: String = ""
var isConsumer: Bool = true
var isChecked: Bool = false
var showSignUpErrors: Bool = false


var category: String {
    if isConsumer {
        return "consumer"
    } else {
       return "contractor"
    }
}

var EmailisInvalid: Bool {
    if email.isEmpty || !email.contains("@") {
        return true
    }
    return false
}

var CompanyNameisInvalid: Bool {
    if companyName.isEmpty && !isConsumer {
        return true
    }
    return false
}

var PhoneNumberisInvalid: Bool {
    if phoneNumber.isEmpty || phoneNumber.count < 10 {
        return true
    }
    return false
}

var PasswordLength: Int {
    return password.count
}

var PasswordConfirmationLength: Int {
    return passwordConfirmation.count
}

var PasswordLengthError: Bool {
    if password.count < 6 || password.isEmpty {
        return true
    }
    return false
}

var PasswordConfirmationError: Bool {
    if passwordConfirmation.isEmpty {
        return true
    }
    return false
}

var PasswordMatchError: Bool {
    if password != passwordConfirmation {
        return true
    }
    return false
}

var FormIsInvalid: Bool {
    if EmailisInvalid ||
        CompanyNameisInvalid ||
        PhoneNumberisInvalid ||
        PasswordLengthError ||
        PasswordConfirmationError ||
        PasswordMatchError ||
        !isChecked
        {
            return true
        }
    return false

}

}
所以这两个按钮:

Button(action:
        { isChecked.toggle()
            print(isChecked)
        }
){
   HStack{
    Image(systemName: isChecked ? "checkmark.square" : "square")
      Text("By clicking the 'Sign Up' button you agree to comply with the  Terms and Conditions as well as the  Privacy Policy.")
        .font(.body)
        .foregroundColor(.primary)
   }
}
并且此按钮不再触发视图更新:

struct AccountType: View {

@Binding var isConsumer: Bool

var body: some View {
Toggle("Change Account Type", isOn: $isConsumer)
    .font(.title2)
    .toggleStyle(SwitchToggleStyle(tint: Color("BrandOrange")))
Spacer()
}
}

您必须将
@Published
添加到要查看更改的每个变量中

@Published var email: String = ""
@Published var companyName: String = ""
@Published var username: String = ""
@Published var firstName: String = ""
@Published var lastName: String = ""
@Published var password: String = ""
@Published var passwordConfirmation: String = ""
@Published var phoneNumber: String = ""
@Published var isConsumer: Bool = true
@Published var isChecked: Bool = false
@Published var showSignUpErrors: Bool = false
也改变

@StateObject var keyboardResponder = KeyboardResponder()

@StateObject var signupVM : SignUpViewModel = SignUpViewModel()


出于好奇的无关问题:从
SignUpViewModel
中的间距来看,您的意思似乎是要发布所有属性。但据我所知,在Swift中,你这样做只会使
电子邮件
被发布。“还是我错了?”LinusGeffarth问得好。我不确定。
@StateObject var keyboardResponder = KeyboardResponder()

@StateObject var signupVM : SignUpViewModel = SignUpViewModel()