用于密码字段清除的文本字段 shouldChangeCharactersIn
Textfield shouldChangeCharactersIn for password field clear
我正在使用 MVVM 结构,当文本字段值更改时更新视图模型。
除密码字段外一切正常
这是代码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text,
let range = Range.init(range, in: text) {
let newText = text.replacingCharacters(in: range, with: string)
if textField == txtOldPassword {
changePasswordViewModel.updateOldPassword(string: newText)
} else if textField == txtNewPassword {
changePasswordViewModel.updateNewPassword(string: newText)
} else if textField == txtConfirmPassword {
changePasswordViewModel.updateConfirmPassword(string: newText)
}
}
return true
}
当从键盘点击退格键(或删除按钮)时密码文件被清除 newText
返回先前设置的值而不是空字符串。
问题:当密码字段被清除时仍然 newText
有字符串
当我试图查看函数返回的范围时,它看起来无效
po range
expression produced error: error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=10, address=0x107a2b000).
The process has been returned to the state before expression evaluation.
我知道我可以做到 textField.clearsOnBeginEditing = false;
但我希望它作为默认功能明确。
请帮助我提前致谢
textField:shouldChangeCharactersInRange:replacementString:
在 textField 上的文本更改之前被调用,因此它不是执行这些工作的正确位置。
我们有另一种检查文本更改的方法,我认为它可以解决您的问题。
txtOldPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
txtNewPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
txtConfirmPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
@objc func textFieldDidChange(textField: UITextField) -> Void {
if let text = textField.text {
if textField == txtOldPassword {
changePasswordViewModel.updateOldPassword(string: text)
} else if textField == txtNewPassword {
changePasswordViewModel.updateNewPassword(string: text)
} else if textField == txtConfirmPassword {
changePasswordViewModel.updateConfirmPassword(string: text)
}
}
}
textFieldDidChange(textField:)
将在文本更改后调用。
我正在使用 MVVM 结构,当文本字段值更改时更新视图模型。
除密码字段外一切正常
这是代码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text,
let range = Range.init(range, in: text) {
let newText = text.replacingCharacters(in: range, with: string)
if textField == txtOldPassword {
changePasswordViewModel.updateOldPassword(string: newText)
} else if textField == txtNewPassword {
changePasswordViewModel.updateNewPassword(string: newText)
} else if textField == txtConfirmPassword {
changePasswordViewModel.updateConfirmPassword(string: newText)
}
}
return true
}
当从键盘点击退格键(或删除按钮)时密码文件被清除 newText
返回先前设置的值而不是空字符串。
问题:当密码字段被清除时仍然 newText
有字符串
当我试图查看函数返回的范围时,它看起来无效
po range expression produced error: error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=10, address=0x107a2b000). The process has been returned to the state before expression evaluation.
我知道我可以做到 textField.clearsOnBeginEditing = false;
但我希望它作为默认功能明确。
请帮助我提前致谢
textField:shouldChangeCharactersInRange:replacementString:
在 textField 上的文本更改之前被调用,因此它不是执行这些工作的正确位置。
我们有另一种检查文本更改的方法,我认为它可以解决您的问题。
txtOldPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
txtNewPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
txtConfirmPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
@objc func textFieldDidChange(textField: UITextField) -> Void {
if let text = textField.text {
if textField == txtOldPassword {
changePasswordViewModel.updateOldPassword(string: text)
} else if textField == txtNewPassword {
changePasswordViewModel.updateNewPassword(string: text)
} else if textField == txtConfirmPassword {
changePasswordViewModel.updateConfirmPassword(string: text)
}
}
}
textFieldDidChange(textField:)
将在文本更改后调用。