在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之间切换),只需将UITextField
的text
属性设置为其当前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开始,似乎UITextField
的text
设置器在用等于当前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在实现时具有不添加额外空间的期望行为:
这适用于我的情况
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];