在secureTextEntry切换之后,UITextField具有尾随空格

Bri*_*ito 34 uitextfield ios

我有一个在显示/隐藏模式之间切换的按钮(即在secureTextEntry NO和YES之间切换UITextField).其目的是允许用户查看他们输入的密码.

我在这里跟踪了这个例子(投票数最多):UITextField secureTextEntry - 从YES转到NO,但是改回YES没有效果

但是,当我将secureTextEntry设置为NO时,在那里写入的任何文本最后都会有一个空格.将secureTextEntry设置为YES时,这似乎不是问题.

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

重要说明: 在调试器中,文本的字符串值显示没有尾随空格,如下所示:

(lldb) expr self.passwordText.text
(NSString *) $0 = 0x1d8450e0 @"mypassword"
Run Code Online (Sandbox Code Playgroud)

我试过修剪空格(避免在UITextField中使用中间空格),但它没有效果.

sun*_*nus 41

我刚遇到这个案子,最后解决了这个问题.

适用于最新的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;
}
Run Code Online (Sandbox Code Playgroud)

Swift 3+

   // Workaround to refresh cursor

    let currentText: String = self.userPassword.text!
    self.userPassword.text = "";
    self.userPassword.text = currentText
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


Mat*_*hew 13

PRE-iOS-8.0 (日期解决方案) ...在按钮的操作方法中(在secureTextEntryYES和NO 之间切换),只需将UITextField's text属性设置为其当前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];
}
Run Code Online (Sandbox Code Playgroud)

后的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
Run Code Online (Sandbox Code Playgroud)


tou*_*bun 8

我有一个干净的解决方案,不会肮脏的text财产UITextField.

用这种风格包裹它们.

[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.
Run Code Online (Sandbox Code Playgroud)


nal*_*exn 6

为了解决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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这适用于iOS8,应标记为"答案" (2认同)