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.

Cómo hacer que un botón funcione sin enlace de navegación (SwiftUI)

Entonces, hice la pantalla de inicio de sesión y el botón con el enlace de navegación y funciona correctamente para la página de inicio. Sin embargo, en la página de inicio hay un botón de retroceso que, al tocarlo, vuelve a la pantalla de inicio de sesión. ¿Cómo se puede solucionar esto con o sin el enlace de navegación?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema del botón de retroceso en la página de inicio que lleva al usuario de vuelta a la pantalla de inicio de sesión, se pueden realizar cualquiera de las siguientes acciones:

    1. Utilizar el modo de pantalla completa: En la vista de destino (HomepageView), se puede configurar el modificador navigationBarBackButtonHidden como true para ocultar el botón de retroceso. Sin embargo, esto resultará en la pérdida de la funcionalidad de navegación incorporada. En su lugar, se puede agregar un botón personalizado que llame al método de navegación popToRootViewController() para volver a la pantalla de inicio de sesión.
    struct HomepageView: View {
        var body: some View {
            NavigationView {
                Text("Homepage")
                    .navigationBarBackButtonHidden(true)
                    .navigationBarItems(leading: Button("Cerrar sesión") {
                        navigationController?.popToRootViewController(animated: true)
                    })
            }
        }
    }
    
    1. Utilizar un gestor de inicio de sesión: Se puede crear un gestor de inicio de sesión que verifique si el usuario ha iniciado sesión o no. Si el usuario ha iniciado sesión, se le llevará a la vista de inicio. Si no ha iniciado sesión, se le llevará a la pantalla de inicio de sesión. De esta manera, los usuarios no podrán volver a la pantalla de inicio de sesión mientras ya hayan iniciado sesión.
    class LoginManager: ObservableObject {
        @Published var isLoggedIn: Bool = false
    
        func login(username: String, password: String) {
            // Verificar credenciales
            isLoggedIn = true
        }
    
        func logout() {
            isLoggedIn = false
        }
    }
    
    struct LoginView: View {
        @State var username: String = ""
        @State var password: String = ""
        @StateObject var loginManager = LoginManager()
    
        var body: some View {
            NavigationView {
                VStack {
                    TextField("Nombre de usuario", text: $username)
                    SecureField("Contraseña", text: $password)
                    Button("Iniciar sesión") {
                        loginManager.login(username: username, password: password)
                    }
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(10)
                    .padding()
                }
                .navigationTitle("Inicio de sesión")
            }
        }
    }
    
    struct HomepageView: View {
        @EnvironmentObject var loginManager: LoginManager
    
        var body: some View {
            NavigationView {
                Text("Página de inicio")
                    .navigationBarItems(leading: Button("Cerrar sesión") {
                        loginManager.logout()
                    })
            }
        }
    }
    
    
    // Inicialización de la aplicación
    @main
    struct MyApp: App {
        var body: some Scene {
            WindowGroup {
                if LoginManager().isLoggedIn {
                    HomepageView().environmentObject(LoginManager())
                } else {
                    LoginView().environmentObject(LoginManager())
                }
            }
        }
    }
    

    En este ejemplo, se utiliza el gestor de inicio de sesión para controlar el proceso de inicio y cierre de sesión. Si el usuario ya ha iniciado sesión, la aplicación mostrará HomepageView en el grupo de ventanas. De lo contrario, mostrará LoginView. El modificador environmentObject se utiliza para inyectar el objeto LoginManager en ambas vistas. El elemento de navegación leading de HomePageView es un botón de Cerrar sesión que llama al método logout del gestor de inicio de sesión.

Comments are closed.