产品有个需求,输入密码框,可以进行明文密文切换。实现了切换,但是实际自己点的时候,发现了3个问题。(ios11出现这个问题,ios12没有这个问题,估计是苹果修改了这个bug)记录一下解决方案。
出现的问题:
1.密文模式下输入英文数字,再切换明文,光标前会出现空格。
如图:
2.输入中文,明文-密文切换时,光标会插在字符中。
实现思路:先清空输入框,再赋值
- (IBAction)openEyes:(UIButton *)sender {
sender.selected = !sender.selected;
//密文明文更换时候的出现空格 或者光标错乱
NSString *text = self.passwordTextField.text;
self.passwordTextField.text = @"";
self.passwordTextField.secureTextEntry = !sender.selected;
self.passwordTextField.text = text;
}
3.密文时输入文字清空
当UITextField经历 明文->密文->明文 时,再次输入,无论你输入什么,都会将所有输入清空。
嗯,这确实是个头疼的问题,也没有任何理由,因为UITextField本身如此,而且当时真的想不到任何办法。
最后终于解决。
思路是这样的:我们都只到UITextField的代理UITextFieldDelegate中有方法
「- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 」相信每个人都会常用,通常我们用来抓用户输入的文字,在每次textfield发生字符改变的时候。
但是我们忽略了这个方法的本身作用,注意返回值,这个方法本身是用来返回「是否允许改变textfield字符」。
实现思路:在代理里面,加多一个判断能避免密文清空的问题。
// 1.避免明文切换成密文后被清空
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if (textField == self.passwordTextField && textField.isSecureTextEntry) {
textField.text = toBeString;
return NO;
}
return YES;
}