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 mostrar un nuevo controlador después de cerrar otro controlador?

Soy nuevo en Swift y quiero hacer una aplicación sencilla.

Cuando el usuario inicia la aplicación, ve el “FirstViewController” donde hay un botón de inicio de sesión. Cuando el usuario toca este botón, la aplicación presenta un “SecondViewController” de forma modal.

En el “SecondViewController” hay campos de texto y un “botón de autenticación”. Quiero que al tocar el “botón de autenticación”, el “SecondViewController” se cierre y el “FirstViewController” muestre el “ThirdViewController”.

Ok, estoy utilizando el método self.navigationController.show()

let secondVC = SecondViewController()
self.navigationController.show(secondVC, sender: self)

y el método dismiss para cerrar el ViewController, PERO cuando intento abrir el ThirdViewController después de dismiss, no funciona.

func buttonTapped() {
    let firstVC = FirstViewController()
    let thirdVC = ThirdViewController()
    firstVC.navigationController.show(thirdVC, sender: self)
    self.dismiss(animated: true, completion: nil)
}

¿Cómo hacerlo correctamente?

No estoy utilizando Storyboard, por si es importante.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la funcionalidad deseada, puedes utilizar el siguiente código:

    1. En tu FirstViewController, crea un IBAction para el botón de inicio de sesión que presentará el SecondViewController de forma modal.
    @IBAction func loginButtonTapped(_ sender: UIButton) {
        let secondVC = SecondViewController()
        secondVC.modalPresentationStyle = .fullScreen
        secondVC.delegate = self // asigna el delegado de SecondViewController
        present(secondVC, animated: true, completion: nil)
    }
    
    1. En tu SecondViewController, crea un protocolo de delegado y una variable de delegado para notificar al FirstViewController cuando se autentica correctamente.
    protocol SecondViewControllerDelegate: AnyObject {
        func authenticationDidSucceed()
    }
    
    class SecondViewController: UIViewController {
    
        weak var delegate: SecondViewControllerDelegate?
    
        @IBAction func authenticateButtonTapped(_ sender: UIButton) {
            // Realiza la lógica de autenticación aquí
    
            // Si la autenticación tiene éxito, notifica al delegado
            delegate?.authenticationDidSucceed()
    
            dismiss(animated: true, completion: nil)
        }
    }
    
    1. Adapta tu FirstViewController al protocolo SecondViewControllerDelegate e implementa el método de delegado para presentar el ThirdViewController.
    extension FirstViewController: SecondViewControllerDelegate {
        func authenticationDidSucceed() {
            let thirdVC = ThirdViewController()
            navigationController?.pushViewController(thirdVC, animated: true)
        }
    }
    

    Ahora, cuando el usuario toque el botón de inicio de sesión en FirstViewController, se presentará el SecondViewController de forma modal. Cuando el usuario toque el botón de autenticación en SecondViewController, se cerrará SecondViewController y se llamará al método authenticationDidSucceed(). Luego, el método de delegado presentará el ThirdViewController utilizando el controlador de navegación.

Comments are closed.