Instantiate y Present ViewController en Swift: Guía completa con respuestas a preguntas frecuentes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Instantiate y Present ViewController en Swift: Análisis completo con ejemplos y respuestas a preguntas frecuentes

\n\n

¡Hola, colegas! Si alguna vez te has enfrentado a la tarea de crear y mostrar programáticamente una nueva pantalla en una aplicación iOS con Swift, seguramente te habrás preguntado: "¿Cómo crear correctamente un ViewController desde Storyboard?", "¿Cómo transferir datos antes de mostrarlo?" y "¿Cuál es la diferencia entre Segue y Present manual?".

\n\n

Este tema es uno de los más populares en Stack Overflow (¡miles de visitas!), y no es para menos. A primera vista todo parece sencillo, pero el diablo, como siempre, está en los detalles. Analicemos todos los matices para que nunca más te confundas con instantiate viewController Swift y present viewController Swift.

\n\n

1. Método básico: Instantiate desde Storyboard

\n\n

El escenario más común es tener un Storyboard con un controlador al que se le ha asignado un Storyboard ID. Sin este identificador, no podrás crear una instancia del controlador programáticamente.

\n\n

Paso 1: Configurar el Storyboard ID

\n

Abre el Storyboard, selecciona el ViewController deseado, ve al inspector Identity Inspector (icono de identificación) y en el campo Storyboard ID ingresa un nombre único, por ejemplo DetailViewController. También asegúrate de que la casilla Use Storyboard ID esté activa.

\n\n

Paso 2: Código para instantiate y present

\n

Ahora, en el lugar necesario de tu código (por ejemplo, al presionar un botón), escribe:

\n\n
import UIKit\n\nclass MainViewController: UIViewController {\n\n    @IBAction func showDetailTapped(_ sender: UIButton) {\n        // 1. Obtener referencia al Storyboard\n        let storyboard = UIStoryboard(name: "Main", bundle: nil)\n        \n        // 2. Crear una instancia del controlador por su Storyboard ID\n        guard let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else {\n            fatalError("No se pudo encontrar el controlador con ID DetailViewController")\n        }\n        \n        // 3. Mostrar el controlador de forma modal\n        present(detailVC, animated: true, completion: nil)\n    }\n}
\n\n

Este es un ejemplo clásico de instantiate viewController Swift. Observa el guard let: es una extracción segura que te protegerá de un fallo de la aplicación si el ID se ingresó incorrectamente.

\n\n

2. Present vs Push: ¿cuándo usar cada uno?

\n\n

Muchos principiantes confunden present (presentación modal) con push (empujar en la pila de navegación). Analicemos la diferencia.

\n\n
    \n
  • Present — es una presentación modal. El controlador aparece desde abajo (o con otra animación) y no está vinculado a la pila de navegación. Se usa para pantallas temporales: inicio de sesión, alertas, formularios.
  • \n
  • Push — funciona solo dentro de un UINavigationController. El controlador se "empuja" a la pila, aparece desde la derecha (por defecto) y obtiene automáticamente un botón "Atrás". Ideal para pantallas jerárquicas: lista -> detalles.
  • \n
\n\n

Para push, usa el método navigationController?.pushViewController(_:animated:).

\n\n
// Push (requiere UINavigationController)\nif let navigationController = navigationController {\n    navigationController.pushViewController(detailVC, animated: true)\n} else {\n    present(detailVC, animated: true, completion: nil) // fallback\n}
\n\n

3. Transferencia de datos antes de Present

\n\n

Una de las preguntas más frecuentes: "¿Cómo transferir datos a un nuevo ViewController antes de que aparezca?". La respuesta es simple: usa propiedades o métodos del controlador antes de llamar a present.

\n\n

Ejemplo con transferencia de una cadena

\n

Supongamos que en DetailViewController hay una propiedad:

\n\n
class DetailViewController: UIViewController {\n    var receivedMessage: String = ""\n    \n    ov                

Blogs

Book Recommendations