ios - password - ¿Cómo alternar una entrada de texto segura de UITextField(ocultar contraseña) en Swift?
hide show password text field swift (18)
¿Por qué usar una var
. En el método de acción del botón de ojo, haga lo siguiente.
password.secureTextEntry = !password.secureTextEntry
ACTUALIZAR
Swift 4.2 (según el comentario de @ROC)
password.isSecureTextEntry.toggle()
Actualmente tengo un campo de UITextfield
con un icono en forma de ojo que cuando se presiona debe activar y desactivar la entrada de texto seguro.
Sé que puede marcar la casilla "ingreso de texto seguro" en el inspector de atributos, pero ¿cómo hacerlo para que se active cada vez que se presione el icono?
Aquí está tu respuesta, no necesitas tomar ninguna var.
@IBAction func showHideAction(sender: AnyObject) {
if tfPassword.secureTextEntry{
tfPassword.secureTextEntry = false
}else{
tfPassword.secureTextEntry = true;
}
}
Como otros han señalado, la propiedad es secureTextEntry
, pero no la encontrará en la documentación de UITextField
, ya que en realidad es heredada por un UITextField
través del protocolo UITextInputTraits
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/#//apple_ref/occ/intfp/UITextInputTraits/secureTextEntry
Puede simplemente cambiar este valor cada vez que toque su botón:
@IBAction func togglePasswordSecurity(sender: UIButton) {
self.passwordField.secureTextEntry = !self.passwordField.secureTextEntry
}
Los valores de asignación cambian de YES/NO
a valores booleanos true/false
.
password.secureTextEntry = true //Visible
password.secureTextEntry = false //InVisible
Puedes probar este código ... creo que es útil.
Para la gente de Xamarin:
passwordField.SecureTextEntry = passwordField.SecureTextEntry? passwordField.SecureTextEntry = false: passwordField.SecureTextEntry = true;
Primero debe configurar la imagen (visible u oculta) del botón del ojo para un estado diferente (seleccionado o normal)
que conectar IBAction y escribir código como
@IBAction func btnPasswordVisiblityClicked(_ sender: Any) {
(sender as! UIButton).isSelected = !(sender as! UIButton).isSelected
if (sender as! UIButton).isSelected {
txtfPassword.isSecureTextEntry = false
} else {
txtfPassword.isSecureTextEntry = true
}
}
Pruebe este código en Swift 4, intente hacer un código reutilizable dentro de un controlador. He configurado una imagen diferente para los botones en el guión gráfico como se muestra en el enlace https://.com/a/47669422/8334818
@IBAction func clickedShowPassword(_ sender: UIButton) {
var textField :UITextField? = nil
print("btn ",sender.isSelected.description)
switch sender {
case encryptOldPswdBtn:
encryptOldPswdBtn.isSelected = !encryptOldPswdBtn.isSelected
textField = oldPasswordTextField
case encryptNewPswdBtn:
encryptNewPswdBtn.isSelected = !encryptNewPswdBtn.isSelected
textField = newPasswordTextField
default:
break
}
print("text ",textField?.isSecureTextEntry.description)
textField?.isSecureTextEntry = !(textField?.isSecureTextEntry ?? false)
}
Solución Swift 4
No necesita extra si la declaración para la propiedad simple isSecureTextEntry de alternancia
func togglePasswordVisibility() {
password.isSecureTextEntry = !password.isSecureTextEntry
}
Pero hay un problema cuando se alterna isSecureTextEntry UITextField no recalcula el ancho del texto y tenemos espacio adicional a la derecha del texto. Para evitar esto deberías reemplazar el texto de esta manera.
func togglePasswordVisibility() {
password.isSecureTextEntry = !password.isSecureTextEntry
if let textRange = password.textRange(from: password.beginningOfDocument, to: password.endOfDocument) {
password.replace(textRange, withText: password.text!)
}
}
Un efecto secundario no deseado de esto es que si el usuario cambia a inseguro y luego vuelve a proteger, el texto existente se borrará si el usuario continúa escribiendo. El cursor también puede terminar en la posición incorrecta a menos que restablecamos el rango de texto seleccionado.
A continuación se muestra una implementación que maneja estos casos (Swift 4)
extension UITextField {
func togglePasswordVisibility() {
isSecureTextEntry = !isSecureTextEntry
if let existingText = text, isSecureTextEntry {
/* When toggling to secure text, all text will be purged if the user
continues typing unless we intervene. This is prevented by first
deleting the existing text and then recovering the original text. */
deleteBackward()
if let textRange = textRange(from: beginningOfDocument, to: endOfDocument) {
replace(textRange, withText: existingText)
}
}
/* Reset the selected text range since the cursor can end up in the wrong
position after a toggle because the text might vary in width */
if let existingSelectedTextRange = selectedTextRange {
selectedTextRange = nil
selectedTextRange = existingSelectedTextRange
}
}
}
Este fragmento de replace(_:withText:)
está utilizando la función replace(_:withText:)
porque activa el evento .editingChanged
, que resulta útil en mi aplicación. Solo establecer text = existingText
debería estar bien también.
Usa este código,
iconClick es una variable bool, o si necesita otra condición, verifíquela,
var iconClick = true
Método de acción del ojo:
@IBAction func iconAction(sender: AnyObject) {
if(iconClick == true) {
passwordTF.secureTextEntry = false
} else {
passwordTF.secureTextEntry = true
}
iconClick = !iconClick
}
Espero que sea útil
Utilice el botón con la imagen del ojo
y hacer el método ButtonHandler
Establecer etiqueta para botón con valor 1
-(IBAction) buttonHandlerSecureText:(UIButton *)sender{
if(sender.tag ==1){
[self.textField setSecureTextEntry:NO];
sender.tag = 2;
}
else{
[self.textField setSecureTextEntry:YES];
sender.tag = 1;
}
}
prueba esta linea
@IBAction func btnClick(sender: AnyObject) {
let btn : UIButton = sender as! UIButton
if btn.tag == 0{
btn.tag = 1
textFieldSecure.secureTextEntry = NO
}
else{
btn.tag = 0
textFieldSecure.secureTextEntry = NO;
}
}
En Swift 4
var iconClick : Bool!
override func viewDidLoad() {
super.viewDidLoad()
iconClick = true
}
@IBAction func showHideAction(_ sender: Any)
{
let userPassword = userPasswordTextFiled.text!;
if(iconClick == true) {
userPasswordTextFiled.isSecureTextEntry = false
iconClick = false
} else {
userPasswordTextFiled.isSecureTextEntry = true
iconClick = true
}
}
Para el objetivo c
Establecer imagen para el botón RightButton In viewdidload
[RightButton setImage:[UIImage imageNamed:@"iconEyesOpen"] forState:UIControlStateNormal];
[RightButton setImage:[UIImage imageNamed:@"iconEyesClose"] forState:UIControlStateSelected];
y luego establecer el método de acción para ese RightButton
-(IBAction)RightButton:(id)sender
{
if (_rightButton.selected)
{
_rightButton.selected = NO;
_passwordText.secureTextEntry = YES;
if (_passwordText.isFirstResponder) {
[_passwordText resignFirstResponder];
[_passwordText becomeFirstResponder];
}
}
else
{
_rightButton.selected = YES;
_passwordText.secureTextEntry = NO;
if (_passwordText.isFirstResponder) {
[_passwordText resignFirstResponder];
[_passwordText becomeFirstResponder];
}
}
}
Swift 3
// MARK: Btn EyeAction
@IBAction func btnEyeAction(_ sender: Any) {
if(iconClick == true) {
txtPassword.isSecureTextEntry = false
iconClick = false
} else {
txtPassword.isSecureTextEntry = true
iconClick = true
}
}
Swift 3
passwordTF.isSecureTextEntry = true
passwordTF.isSecureTextEntry = false
Utilice la vista derecha de UITextFiled para mostrar togle buuton
var rightButton = UIButton(type: .custom)
rightButton.frame = CGRect(x:0, y:0, width:30, height:30)
yourtextfield.rightViewMode = .always
yourtextfield.rightView = rightButton
@IBAction func eye_toggle_clicked(sender: AnyObject)
{
if toggleBtn.tag == 0
{
passwordTxt.secureTextEntry=true
toggleBtn.tag=1
}
else
{
passwordTxt.secureTextEntry=false
toggleBtn.tag=0
}
}