es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prevenir que SecureField se borre automáticamente en SwiftUI

Estoy utilizando una combinación de TextField y SecureField en la pantalla de inicio de sesión de la aplicación, el usuario puede hacer clic en el botón del ojo para mostrar y ocultar el texto usando este código:

ZStack(alignment: .trailing){
    if isSecured{
        SecureField(placeholder, text: $text)
            .padding(.trailing, 35)
    }else{
        TextField(placeholder, text: $text)
            .padding(.trailing, 35)
    }

    Button {
        isSecured = !isSecured
    } label: {
        Image(systemName: isSecured ? "eye.slash" : "eye")
    }

}
.background(
    Color.gray
        .frame(height: 0.5)
        .padding(.top, 40)
)

Entonces, cuando el usuario hace clic en el botón del ojo para mostrar la contraseña y luego vuelve a hacer clic en el botón del ojo para ocultar la contraseña, SecureField se borra automáticamente al ingresar texto, ¿hay alguna manera de que la contraseña no se borre automáticamente? gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de evitar que la contraseña se borre automáticamente en SecureField cuando se hace clic en el botón de ojo para mostrar y ocultar la contraseña.

    Una posible solución es almacenar el texto de la contraseña en una variable separada y actualizarla solo cuando el usuario envíe el formulario de inicio de sesión, en lugar de utilizar la vinculación TextField/SecureField directamente. De esta manera, el texto de la contraseña no se ve afectado por la alternancia del botón de ojo.

    Aquí tienes un ejemplo de cómo se puede implementar:

    @State private var rawPasswordText = ""
    @State private var password = ""
    
    ...
    
    ZStack(alignment: .trailing) {
        if isSecured {
            SecureField(placeholder, text: $rawPasswordText)
                .padding(.trailing, 35)
        } else {
            TextField(placeholder, text: $rawPasswordText)
                .padding(.trailing, 35)
        }
    
        Button(action: {
            isSecured.toggle()
            if isSecured {
                password = rawPasswordText
            } else {
                rawPasswordText = password
            }
        }) {
            Image(systemName: isSecured ? "eye.slash" : "eye")
        }
    }
    .background(
        Color.gray
            .frame(height: 0.5)
            .padding(.top, 40)
    )
    
    ...
    
    Button("Iniciar sesión") {
        password = rawPasswordText // almacenar contraseña solo cuando el usuario envíe el formulario
        // realizar acción de inicio de sesión
    }
    

    En este ejemplo, la variable rawPasswordText está vinculada al TextField/SecureField y se actualiza a medida que el usuario escribe. La variable password se actualiza solo cuando el usuario hace clic en el botón de inicio de sesión, lo que activa la acción para almacenar el texto de la contraseña. Cuando el usuario activa el botón de ojo, la contraseña se actualiza en consecuencia, pero el texto de la contraseña real que se muestra en el SecureField/TextField permanece sin cambios.

Comments are closed.