UITextField has trailing whitespace after secureTextEntry toggle

后端 未结 18 1218
逝去的感伤
逝去的感伤 2020-12-29 19:27

I have a button that toggles between Show/Hide mode (i.e. toggles a UITextField between secureTextEntry NO and YES). The purpose of which is to allow the user to see the pa

相关标签:
18条回答
  • 2020-12-29 20:09

    This work for me on 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;
    }
    
    0 讨论(0)
  • 2020-12-29 20:09

    I had a similar issue and realized it was because I was updating the text before setting the secureTextEntry property. It makes sense that the textField would draw out the caret at the location it'd be at if it were using secureTextEntry.

    I did not read the entire problem nor did I visit the solution linked by OP, but in case someone else has the same issue as me:

    Try updating your text after setting the secureTextEntry property.

    0 讨论(0)
  • 2020-12-29 20:11

    When we change a textfield.secureTextEntry property, the caret position is not updated. To fix this, the code below used to work before IOS 8:

    pwdTextField.text  = pwdTextField.text
    

    Now it doesn't. It seems IOS 8 detects the new value equals old value and does nothing. So to make it work again we have to actually change the value. Here is the swift version that works for me.

    let str = pwdTextField.text
    pwdTextField.text = str + " "
    pwdTextField.text = str
    
    0 讨论(0)
  • 2020-12-29 20:13

    i've just encounter this case and finally solved this problem.

    works on Latest iOS SDK, iOS 8.1

    First of all, there is no trailing space at all.

    The dot(shown in SecureEntry) character and normal character have different width and after you toggle isSecureEntry switch, the cursor didn't refresh it's position.

    so i use this workaround to solved this problem.

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

    Swift 3+

       // Workaround to refresh cursor
    
        let currentText: String = self.userPassword.text!
        self.userPassword.text = "";
        self.userPassword.text = currentText
    

    hope it helps!

    0 讨论(0)
  • 2020-12-29 20:13

    In order to work around this bug in iOS you can simply do the following (works for any iOS version):

    - (IBAction)toggleSecureTextEntry:(UIButton *)button
    {
        self.textField.secureTextEntry = !self.textField.secureTextEntry;
        NSString *originalText = self.textField.text;
        self.textField.text = nil;
        self.textField.text = originalText;
    }
    
    0 讨论(0)
  • 2020-12-29 20:15

    Everytime the text is set in the UITextField, the cursor postition is updated

    So I used this code

    partial void btnShowPassword_ToutchUpInside (UIButton sender)
        {
            if (TxtPassword.SecureTextEntry == true) {
                TxtPassword.SecureTextEntry = false;
                TxtPassword.Text = TxtPassword.Text;
            } else {
                TxtPassword.SecureTextEntry = true;
            }
        }
    
    0 讨论(0)
提交回复
热议问题