具有“安全”属性的UITextfield的iOS 6和iOS 5中的退格function

我有一个UITextfield用于在启用SECURE属性的情况下input密码。

当用户在input一定数量的字符后轻敲UITextfield外,然后再次UITextfield进行编辑时,会发生以下行为:

iOS 5.1 – 当我尝试从UITextfield删除一个字符(使用键盘的backspace键)时,最后一个字符被删除。

iOS 6.0 – 当我尝试从UITextfield删除一个字符时,所有键入的字符都被删除。

我做错了什么,或者这是在iOS 6中的错误?

这是在iOS6下的预期行为,你不应该改变它。

如果因为某种原因你真的需要这个,你可以重写UITextField的委托方法textField:shouldChangeCharactersInRange:replacementString:并恢复旧的行为:

 #import "ViewController.h" @interface ViewController () <UITextFieldDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.passwordField.delegate = self; } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (range.location > 0 && range.length == 1 && string.length == 0) { // iOS is trying to delete the entire string textField.text = [textField.text substringToIndex:textField.text.length - 1]; return NO; } return YES; } @end 

关于这个新行为,iOS 6也有一个问题。 尝试这个:

  1. 使用两个UITextFields导航到一个视图,一个是安全的
  2. 在不安全的文本字段中input任何内容。
  3. 点击安全文本字段,不要键入或删除任何东西。 再次回到不安全的领域
  4. 击退退格一次

中提琴! 你现在没有什么文字。 我能够在iOS 6.0.x和6.1中一致地重现这一点

看起来这可以通过在viewDidLoad或其附近明确地设置secureTextEntry为NO来解决。

 - (void)viewDidLoad { [super viewDidLoad]; self.textField.secureTextEntry = NO; } 

这似乎与上述情况(在电子邮件字段和一个安全的密码字段的视图),在iOS 6下工作。

HTH!

这里有一个方法来检测一个安全字段是否将被一个退格清除:

iOS 6 UITextField安全 – 如何检测退格清除所有字符?