在secureTextEntry切换之后,UITextField具有拖尾空白

我有一个button,切换显示/隐藏模式(即切换secureTextEntry NO和YES之间的UITextField)。 其目的是让用户看到他们input的密码。

我跟着这个例子(具有最高的票数)在这里: UITextField secureTextEntry – 工作从YES到NO,但改回YES没有任何影响

但是,当我将secureTextEntry设置为NO时,写入的任何文本最后都以空格结束。 将secureTextEntry设置为YES时,这似乎不成问题。

例如,如果在setSecureTextEntry设置为NO时input文本“mypassword”,然后将其切换为YES,则用户将看到**********(10个点),这是正确的。 如果我将SetSecureTextEntry设置为NO,用户将看到“mypassword”(在最后一个空格,或者至less光标向右移动一个空格)。

重要说明:在debugging器中,文本的string值显示尾随空格,如下所示:

(lldb) expr self.passwordText.text (NSString *) $0 = 0x1d8450e0 @"mypassword" 

我试图修剪空白(每个避免UITextField中的空白 ),但它没有任何影响。

我刚刚遇到这个案子,终于解决了这个问题。

适用于最新的iOS SDK,iOS 8.1

首先,根本没有尾随空间。

点(在SecureEntry中显示)字符和正常字符具有不同的宽度,在您切换isSecureEntry开关后,光标不会刷新其位置。

所以我使用这个解决方法来解决这个问题。

 - (void)toggle { NSString *tmpString; [self.passwordTextField setSecureTextEntry:!self.passwordTextField.isSecureTextEntry]; if (self.passwordTextField.isSecureTextEntry) { // do stuffs } else { // do other stuffs } // Workaround to refresh cursor tmpString = self.passwordTextField.text; self.passwordTextField.text = @" "; self.passwordTextField.text = tmpString; } 

希望能帮助到你!

PRE-iOS-8.0 (已过时的解决scheme) …在button的操作方法(在secureTextEntry YES和NO之间切换),只需将UITextFieldtext属性设置为其当前text值即可。 虽然这可能看起来多余,有点像黑客攻击,但是会将光标重新绘制在正确的位置。 这是一个你的button的动作方法应该看起来像现在的例子…

 -(void)toggleButtonPressed:(UIButton*)sender { // Toggle between secure and not-so-secure entry self.toggleButton.selected = !self.toggleButton.selected; self.textfield.secureTextEntry = !self.toggleButton.selected; // * Redundant (but necessary) line * [self.textfield setText:self.textfield.text]; } 

POST-iOS-8.0 …从iOS 8.0开始,似乎UITextFieldtext设置器在用等于当前string值的string调用时不再重绘光标。 现在,我们需要更进一步,在重新设置之前实际改变text值。 将上面的setText:行replace成像这些行一样的东西。

 // * Extra redundant (but necessary) lines * NSString *currentText = self.textfield.text; [self.textfield setText:@"Arbitrary string..."]; // Change the value [self.textfield setText:currentText]; // Reset the value 

为了解决这个在iOS中的错误,你可以简单地执行以下操作(适用于任何iOS版本):

 - (IBAction)toggleSecureTextEntry:(UIButton *)button { self.textField.secureTextEntry = !self.textField.secureTextEntry; NSString *originalText = self.textField.text; self.textField.text = nil; self.textField.text = originalText; } 

这个工作在iOS 8我

 if (self.passwordTextField.secureTextEntry) { // Display password and keep selected text range UITextRange *selectedTextRange = self.passwordTextField.selectedTextRange; NSString *password = self.passwordTextField.text; self.passwordTextField.secureTextEntry = NO; self.passwordTextField.text = [@"" stringByPaddingToLength:password.length withString:@" " startingAtIndex:0]; // Done for carret redrawing self.passwordTextField.text = password; self.passwordTextField.selectedTextRange = selectedTextRange; } else { // Hide password and keep selected text range UITextRange *selectedTextRange = self.passwordTextField.selectedTextRange; NSString *password = self.passwordTextField.text; self.passwordTextField.secureTextEntry = YES; self.passwordTextField.text = [@"" stringByPaddingToLength:password.length withString:@" " startingAtIndex:0]; // Done for carret redrawing self.passwordTextField.text = password; self.passwordTextField.selectedTextRange = selectedTextRange; } 
 UITextPosition *beginning = [self.passwordField beginningOfDocument]; [self.passwordField setSelectedTextRange:[self.passwordField textRangeFromPosition:beginning toPosition:beginning]]; UITextPosition *end = [self.passwordField endOfDocument]; [self.passwordField setSelectedTextRange:[self.passwordField textRangeFromPosition:end toPosition:end]]; 

这是我用于iOS 8的

当我们改变textfield.secureTextEntry属性时,插入符的位置不会被更新。 为了解决这个问题,下面的代码用于在IOS 8之前工作:

 pwdTextField.text = pwdTextField.text 

现在不行。 看来IOS 8检测到的新值等于旧值,什么都不做。 所以为了再次运作,我们必须改变价值。 这里是适合我的快速版本。

 let str = pwdTextField.text pwdTextField.text = str + " " pwdTextField.text = str 

这是解决此问题的另一种可能性,其中self.passwordText是UITextField:

 if (self.passwordText.isFirstResponder) { [self.passwordText resignFirstResponder]; [self.passwordText becomeFirstResponder]; } 

你可以像这样解决它:

 NSString *currentText = self.textfield.text; self.textfield.text = @""; self.textfield.text = currentText; 

我有一个干净的解决scheme不会与UITextField text属性脏。

用这种风格包装他们。

 [self.passwordTextField resignFirstResponder]; // first resign its first responder. // change `secureTextEntry` property's value if necessary. if (self.passwordTextField.secureTextEntry) { self.passwordTextField.secureTextEntry = NO; self.passwordEcryptButton.selected = YES; }else{ self.passwordTextField.secureTextEntry = YES; self.passwordEcryptButton.selected = NO; } [self.passwordTextField becomeFirstResponder]; // finally gain its first responder again. 

看来,引用链接中的第二个解决scheme在实现时具有不添加额外空间的期望行为:

https://stackoverflow.com/a/8495888/738190

这适用于我的情况

  BOOL wasFirstResponder = [self.passwordTextField isFirstResponder]; if([self.passwordTextField isSecureTextEntry]) { //This three lines are key self.passwordTextField.delegate = nil; [self.passwordTextField resignFirstResponder]; self.passwordTextField.delegate = self; } [self.passwordTextField setSecureTextEntry: !self.passwordTextField.isSecureTextEntry]; if(wasFirstResponder) [self.passwordTextField becomeFirstResponder]; 

Swift UITextField扩展:

 extension UITextField { func toggleSecureEntry() { let wasFirstResponder = isFirstResponder() if wasFirstResponder { resignFirstResponder() } secureTextEntry = !secureTextEntry if wasFirstResponder { becomeFirstResponder() } } } 

设置textField.text解决scheme也适用于某些情况下,但不是我的需要(自定义字体与两个文本字段。引起的字体更改和毛刺在运行时。)也在这里添加。

 func toggleSecureEntry() { secureTextEntry = !secureTextEntry let originalText = text text = nil text = originalText } 

为了让光标正确地重新定位,设置字体属性似乎对我来说是个诀窍。

 // Hack to update cursor position self.passwordTf.defaultTextAttributes = @{NSFontAttributeName: textFieldFont, NSForegroundColorAttributeName: textFieldColor}; // Change secure entry self.passwordTf.secureTextEntry = !self.passwordTf.secureTextEntry; 

在iOS8,iOS9上testing 希望能帮助到你!

每当文本被设置在UITextField中时,光标的位置就会被更新

所以我使用这个代码

 partial void btnShowPassword_ToutchUpInside (UIButton sender) { if (TxtPassword.SecureTextEntry == true) { TxtPassword.SecureTextEntry = false; TxtPassword.Text = TxtPassword.Text; } else { TxtPassword.SecureTextEntry = true; } } 

我正在使用这个,工作正常。 快乐的编码

  [self.yourTextField becomeFirstResponder];