Instantiate e Present ViewController em Swift: Análise completa com exemplos e respostas para perguntas frequentes
\n\nOlá, colegas! Se você já se deparou com a tarefa de criar e exibir programaticamente uma nova tela em um aplicativo iOS em Swift, certamente já se perguntou: "Como criar corretamente um ViewController a partir do Storyboard?", "Como passar dados antes da exibição?" e "Qual a diferença entre Segue e Present manual?".
\n\nEste tópico é um dos mais populares no Stack Overflow (milhares de visualizações!), e não é à toa. À primeira vista, tudo parece simples, mas o diabo, como sempre, está nos detalhes. Vamos analisar todas as nuances para que você nunca mais se confunda com instantiate viewController Swift e present viewController Swift.
\n\n1. Método básico: Instantiate a partir do Storyboard
\n\nO cenário mais comum é você ter um Storyboard com um controlador que possui um Storyboard ID atribuído. Sem esse identificador, você não conseguirá criar uma instância do controlador programaticamente.
\n\nPasso 1: Configuração do Storyboard ID
\nAbra o Storyboard, selecione o ViewController desejado, vá para o inspetor Identity Inspector (ícone com crachá de identificação) e no campo Storyboard ID insira um nome único, por exemplo DetailViewController. Certifique-se também de que a caixa de seleção Use Storyboard ID esteja ativa.
Passo 2: Código para instantiate e present
\nAgora, no local desejado do seu código (por exemplo, ao clicar em um botão), escreva:
\n\nimport UIKit\n\nclass MainViewController: UIViewController {\n\n @IBAction func showDetailTapped(_ sender: UIButton) {\n // 1. Obtém a referência ao Storyboard\n let storyboard = UIStoryboard(name: "Main", bundle: nil)\n \n // 2. Cria uma instância do controlador pelo seu Storyboard ID\n guard let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else {\n fatalError("Não foi possível encontrar o controlador com o ID DetailViewController")\n }\n \n // 3. Exibe o controlador modalmente\n present(detailVC, animated: true, completion: nil)\n }\n}\n\nEste é um exemplo clássico de instantiate viewController Swift. Observe o guard let — é uma extração segura que o protegerá de uma falha do aplicativo se o ID foi digitado incorretamente.
2. Present vs Push: quando usar cada um?
\n\nMuitos iniciantes confundem present (exibição modal) com push (empurrar na pilha de navegação). Vamos analisar a diferença.
\n\n- \n
- Present — é uma exibição modal. O controlador aparece de baixo (ou com outra animação) e não está vinculado à pilha de navegação. Usado para telas temporárias: login, alertas, formulários. \n
- Push — funciona apenas dentro de um UINavigationController. O controlador é "empurrado" para a pilha, aparece à direita (por padrão) e recebe automaticamente um botão "Voltar". Ideal para telas hierárquicas: lista -> detalhes. \n
Para push, use o método navigationController?.pushViewController(_:animated:).
// Push (requer UINavigationController)\nif let navigationController = navigationController {\n navigationController.pushViewController(detailVC, animated: true)\n} else {\n present(detailVC, animated: true, completion: nil) // fallback\n}\n\n3. Passagem de dados antes do Present
\n\nUma das perguntas mais frequentes: "Como passar dados para um novo ViewController antes que ele apareça?". A resposta é simples: use propriedades ou métodos do controlador antes de chamar o present.
\n\nExemplo com passagem de string
\nSuponha que no DetailViewController exista a propriedade:
\n\nclass DetailViewController: UIViewController {\n var receivedMessage: String = ""\n \n ov