如果选中复选框,如何使用 UserDefaults 保留电子邮件和密码文本字段信息 Swift iOS

How to persist email and password textfield info using UserDefaults if checkbox is selected Swift iOS

我正在为复选框使用 BEMCheckBox 库。 问题是当复选框为真时,它不会保存用户的输入

我尝试做的是当 checkbox == true 时 这应该, 保存电子邮件和密码并将复选框设置为 true,然后将其保存为用户默认值。

如果==假 应删除所有内容(电子邮件、密码并将复选框重置为 false)。 , 但它不起作用。

 var Defaults = UserDefaults.standard

@IBOutlet weak var box1: BEMCheckBox!

 struct keys {

    static let emailKey = "emailTextField"
    static let passwordKey = "passwordTextField"
    static var boxBool = "boxBool"

}
    override func viewDidLoad() {
    didTap(box1)
    box1.delegate = self
    checkSavedData()
}


func didTap(_ checkBox: BEMCheckBox) {


    if checkBox.on == true {

        rememberMyEmailandPassword()

    } else if checkBox.on == false {

        Defaults.removeObject(forKey: keys.emailKey)
        Defaults.removeObject(forKey: keys.passwordKey)
        Defaults.removeObject(forKey: keys.boxBool)
    }

}

 func rememberMyEmailandPassword() {
    Defaults.set(emailTextField.text, forKey: keys.emailKey)
    Defaults.set(passwordTextField.text, forKey: keys.passwordKey)
    Defaults.set(box1.on, forKey: keys.boxBool)


}

func checkSavedData() {
    let email = Defaults.value(forKey: keys.emailKey) as? String ?? ""
    let password = Defaults.value(forKey: keys.passwordKey) as? String ?? ""
    let boxBoolean = Defaults.bool(forKey: keys.boxBool)

    emailTextField.text = email
    passwordTextField.text = password
    box1.on = boxBoolean
}

我认为是 boxBoolean 的问题。因为我相信 boxBoolean 不会再次调用数据。

谢谢。

var defaults = UserDefaults.standard

@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var box1: BEMCheckBox!

enum Keys: String {
    case email, password, box1
}

override func viewDidLoad() {

    // 1) loads the checkBox state when the view loads
    box1.on = defaults.bool(forKey: Keys.box1.rawValue)

    box1.delegate = self

    // 2) update the UI in case it is checked
    if box1.on { 
       loadData() 
    }
    // 3) adds a control event for editing changed to both fields
    emailTextField.addTarget(self, action: #selector(saveData), for: .editingChanged)
    passwordTextField.addTarget(self, action: #selector(saveData), for: .editingChanged)
}

func didTap(_ checkBox: BEMCheckBox) {

    // 4) saves the checkbox state
    defaults.set(box1.on, forKey: Keys.box1.rawValue)

    // 5) Saves field data or remove it
    if box1.on  {
        defaults.set(emailTextField.text!, forKey: Keys.email.rawValue)
        defaults.set(passwordTextField.text!, forKey: Keys.password.rawValue)
    } else {
        // 6) You should NEVER remove the checkbox value
        defaults.removeObject(forKey: Keys.email.rawValue)
        defaults.removeObject(forKey: Keys.password.rawValue)
    }
}

@objc func saveData(_ textField: UITextField) {
    // 7) update the data as the user types it in case it is checked
    if box1.on  {
        defaults.set(emailTextField.text!, forKey: Keys.email.rawValue)
        defaults.set(passwordTextField.text!, forKey: Keys.password.rawValue)
    }
}

func loadData() {
    // 8) updates the UI with the persisted data
    // Note that text property is optional so you can pass an optional string (no need to unwrap it)
    emailTextField.text = defaults.string(forKey: Keys.email.rawValue)
    passwordTextField.text = defaults.string(forKey: Keys.password.rawValue)
}