UITextField tiene espacios en blanco finales después de alternar secureTextEntry

Tengo un button que alterna entre el modo Mostrar / Ocultar (es decir, alterna un UITextField entre secureTextEntry NO y YES). El propósito de esto es permitir al usuario ver la contraseña que están ingresando.

Seguí el ejemplo (con el mayor número de votos) aquí: UITextField secureTextEntry – funciona yendo de SÍ a NO, pero volver a SÍ no tiene efecto

Sin embargo, cuando establezco secureTextEntry a NO, cualquier text que se haya escrito allí termina con un espacio al final. Esto no parece ser un problema cuando se establece secureTextEntry en YES.

Por ejemplo, si ingreso el text "contraseña mypass" mientras setSecureTextEntry está establecido en NO, y luego lo cambio a SÍ, el usuario verá ********** (10 puntos), lo cual es correcto. Si establezco SecureTextEntry en NO, el usuario verá "contraseña mypass" (con un espacio al final, o al less, el cursor se mueve un espacio hacia la derecha).

Nota importante: en el depurador, el valor de cadena del text aparece sin el espacio posterior, así:

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

He intentado recortar espacios en blanco (por evitar espacios en blanco medios en UITextField ), pero no ha tenido ningún efecto.

Acabo de encontrar este caso y finalmente resolví este problema.

funciona en el último iOS SDK, iOS 8.1

En primer lugar, no hay espacio de salida en absoluto.

El carácter de punto (mostrado en SecureEntry) y el carácter normal tienen un ancho diferente y después de alternar el interruptor isSecureEntry, el cursor no actualizó su position.

así que uso esta solución para resolver este problema.

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

¡Espero eso ayude!

PRE-iOS-8.0 (solución de date) … En el método de acción de su button (alternando entre secureTextEntry YES y NO), simplemente establezca la propiedad de text UITextField en su valor de text actual. Aunque esto puede parecer networkingundante y un poco como un truco, esto volverá a dibujar el cursor en la position correcta. Aquí hay un ejemplo de cómo debería verse el método de acción de su button ahora …

 -(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 … A partir de iOS 8.0, parece que el UITextField de text UITextField ya no vuelve a dibujar el cursor cuando se le llama con una cadena igual a su valor de cadena actual. Ahora, debemos llevar esto un paso más allá y, de hecho, cambiar el valor del text antes de reiniciarlo nuevamente. Reemplace la línea de setText: con algo así como estas líneas.

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

Para evitar este error en iOS, simplemente puedes hacer lo siguiente (funciona para cualquier versión de iOS):

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

Esto me funciona en 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 networkingrawing 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 networkingrawing 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]]; 

Esto es lo que usé para iOS 8

Cuando cambiamos una propiedad textfield.secureTextEntry, la position del cursor no se actualiza. Para solucionarlo, el código siguiente solía funcionar antes del IOS 8:

 pwdTextField.text = pwdTextField.text 

Ahora no lo hace Parece que iOS 8 detecta que el nuevo valor es igual a un valor antiguo y no hace nada. Entonces, para que funcione nuevamente, tenemos que cambiar el valor. Aquí está la versión rápida que funciona para mí.

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

Esta es otra posibilidad para resolver este problema, donde self.passwordText es UITextField:

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

Puedes arreglarlo así:

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

Parece que la segunda solución en el enlace referencedo, cuando se implementa, tiene el comportamiento deseado de no agregar un espacio adicional:

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

Esto funciona en mi caso

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

Tengo una solución limpia que no se ensucia con la propiedad de text de UITextField .

Envuélvelos con este estilo.

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

Extensión Swift UITextField:

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

La configuration de la solución textField.text también funciona en algunas situaciones, pero no para mi necesidad (fuente personalizada con dos campos de text. Causó cambios de fuente y fallos en el time de ejecución). Agregando aquí también.

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

Para que el cursor se reposicione correctamente, configurar los attributes de la fuente me pareció un buen truco.

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

Probado en iOS8, iOS9. ¡Espero eso ayude!

Cada vez que se establece el text en UITextField, la publicación del cursor se actualiza

Entonces usé este código

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

Estoy usando esto, funciona bien. Feliz encoding

  [self.yourTextField becomeFirstResponder];