开发语言:swift4.2
废话不多说,上代码
第一步,实现密文从最后向前一个个删除
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
return false
}
return true
}
这一步之后,会发现当光标从密文中间往前删除的话,删除一个密文光标就会跑的密文最后的位置,第二步,解决这个问题
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
let start = textField.position(from:textField.beginningOfDocument, offset: range.location)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
return false;
}
return true
}
代码修改之后,会发现光标正常了,但是当密文密码中间一直删除到开头之后发现,光标之后的密文还是会一下都删除掉,这时候来看第三步
首先重写UITextField的deleteBackward()方法
class BaseTextField: UITextField {
weak var baseTextFieldDelegate: BaseTextFieldDeleteDelegate?
override func deleteBackward() {
super.deleteBackward()
guard let baseTextFieldDelegate = baseTextFieldDelegate else {
print("baseTextFieldDelegate is nil.")
return
}
baseTextFieldDelegate.baseTextFieldDeleteBackward(baseTextField: self)
}
}
然后定义一个变量var secretString
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
let start = textField.position(from:textField.beginningOfDocument, offset: range.location)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
secretString = secretInputField.text!
return false;
}
return true
}
实现BaseTextField的代理方法
func baseTextFieldDeleteBackward(baseTextField: BaseTextField) {
if baseTextField == secretInputField {
secretInputField.text = secretString
}
}
你以为到这里就结束了?再点点少年,你会发现我的天,当从中间删除密文时,删除完之后,光标又跑了最后面去了,来接着第五步
func baseTextFieldDeleteBackward(baseTextField: BaseTextField) {
if baseTextField == secretInputField {
secretInputField.text = secretString
if secretInputField.text != "" && secretInputField.isSecureTextEntry {
/// 让光标始终停在在最初的位置
let start = baseTextField.position(from:baseTextField.beginningOfDocument, offset: 0)
let end = baseTextField.position(from: start!, offset: 0)
baseTextField.selectedTextRange = baseTextField.textRange(from: start!, to: end!)
return
}
}
}
到了这里,你点啊点,终于发现密文没有问题了,你可以先笑一笑,因为明文又出现问题了,你发现明文删不动了,来最后一步
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldContent = textField.text as NSString?
let textfieldContent2 = textFieldContent?.replacingCharacters(in: range, with: string)
if textField == secretInputField && string == "" {
textField.text = textfieldContent2
let start = textField.position(from:textField.beginningOfDocument, offset: range.location)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
secretString = secretInputField.text!
return false;
}
if textField == secretInputField && string != "" {
textField.text = textfieldContent2;
let start = textField.position(from:textField.beginningOfDocument, offset: range.location+1)
let end = textField.position(from: start!, offset: 0)
textField.selectedTextRange = textField.textRange(from: start!, to: end!)
secretString = secretInputField.text!
return false;
}
return true
}
好了,这下天下太平了。
网友评论