2013-01-08 68 views
26

我有一个在显示/隐藏模式(即切换secureTextEntry NO和YES之间的UITextField)之间切换的按钮。其目的是让用户看到他们输入的密码。UITextField在secureTextEntry切换后有空格后面的空格

我跟着例子(带票的最高数字)位置:UITextField secureTextEntry - works going from YES to NO, but changing back to YES has no effect

但是,当我设置secureTextEntry为NO,这是写有任何文本,并在最后一个空格结束。将secureTextEntry设置为YES时,这似乎不成问题。

例如,如果我在setSecureTextEntry设置为NO时输入文本“mypassword”,然后将其切换为YES,则用户将看到**********(10个点),即正确。如果我将SetSecureTextEntry设置为NO,用户将看到“mypassword”(末尾有空格,或者至少光标向右移动一个空格)。

重要提示:在调试器,文本字符串值出现没有后间隔,就像这样:

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

我试图微调空白(每avoid middle whitespace in UITextField),但它已没有影响。

+1

我认为iOS的继续吸引闪烁的光标在同一位置。点比文本宽,所以文本和光标之间总会有间隙。 '空白'并不在文本框中,它看起来像是因为光标的位置。 – russau

回答

10

PRE-IOS-8.0 (过时溶液)。 ..在按钮的操作方法(在secureTextEntry YES和NO之间切换),只需将UITextFieldtext属性设置为其当前的text值。虽然这可能看起来多余,有点像黑客攻击,但会将光标重新绘制在正确的位置。这里是你的按钮的操作方法应该是什么样子,现在的例子...

-(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]; 
} 

后的iOS 8.0 ...作为的iOS 8.0的,看来UITextFieldtext二传手不再重新绘制光标时用与当前字符串值相等的字符串调用。现在,我们需要更进一步,在重新设置之前实际更改text的值。将上面的setText:行替换为类似这些行的内容。

// * 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 
+6

这在iOS 8.1中不起作用。 – sethfri

+0

你是对的 - 它看起来像UITextField的iOS 8.0+文本''setter现在忽略重复的字符串...谢谢@sethfri和其他评论者。 – Matthew

+0

这在9.3'textField.text = textField.text'很好用(切换安全文本输入后) – SuitedSloth

3

在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; 
} 
3
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

2

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

pwdTextField.text = pwdTextField.text 

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

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

我刚刚遇到这种情况,终于解决了这个问题。

作品在最新的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; 
} 

希望它有帮助!

+0

谢谢:) – Leena

+0

游标刷新的那3行删除了空白区域// //刷新游标的解决方法 tmpString = self.passwordTextField.text; self.passwordTextField.text = @“”; self.passwordTextField.text = tmpString;' –

2

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

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

为了解决这个bug在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; 
} 
+2

这适用于iOS8,应该标记为“答案” – bubuxu

1

这部作品在我的情况

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]; 
0

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

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

// Change secure entry 
self.passwordTf.secureTextEntry = !self.passwordTf.secureTextEntry; 

在iOS8,iOS9上测试。 希望它有帮助!

2

你能解决这个问题是这样的:

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

我有一个干净的解决方案不会脏的UITextFieldtext财产。

用这种风格包装它们。

[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. 
+0

非常好。也适用于iOS 11。谢谢! –

0

每次文本中的UITextField设置,光标postition更新

所以我用这个代码

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

斯威夫特的UITextField扩展:

extension UITextField { 
    func toggleSecureEntry() { 
     let wasFirstResponder = isFirstResponder() 

     if wasFirstResponder { resignFirstResponder() } 
     secureTextEntry = !secureTextEntry 
     if wasFirstResponder { becomeFirstResponder() } 
    } 
} 

设置文本框.text解决方案也适用于某些情况,但不适合我的需要(具有两个文本字段的自定义字体在运行时会自动更改字体和毛刺。)也在这里添加。

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

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

[self.yourTextField becomeFirstResponder];