Introdução: por que seu UIAlertView não funciona (e o que o Stack Overflow tem a ver com isso)
\n\nSe você já pesquisou no Google "How would I create a UIAlertView in Swift?" — não está sozinho. Essa pergunta no Stack Overflow acumulou centenas de milhares de visualizações. Parece simples, não? Mostrar ao usuário uma janela pop-up com um botão "OK". Mas, na prática, iniciantes (e até veteranos) tropeçam nos mesmos erros.
\n\nNeste artigo, vamos analisar os 5 principais erros ao criar UIAlertView em Swift, mostrar como corrigi-los e fornecer código pronto para UIAlertController — a substituição moderna da API obsoleta. Se você quer escrever código limpo e funcional, sem crashes — continue conosco.
\n\nErro nº 1: Usar UIAlertView em vez de UIAlertController
\n\nO erro mais comum é tentar chamar UIAlertView no Swift moderno. Essa classe foi descontinuada (deprecated) desde o iOS 8. Se você escreve:
let alert = UIAlertView(title: "Erro", message: "Algo deu errado", delegate: nil, cancelButtonTitle: "OK")\nalert.show()\n\n…o compilador provavelmente emitirá um aviso ou erro. E se o projeto compilar — na melhor das hipóteses, o alerta não funcionará corretamente no iOS 13+.
\n\nPor que isso acontece?
\nA Apple substituiu UIAlertView por UIAlertController já no iOS 8. A classe antiga não é mais suportada e seu uso pode causar comportamentos inesperados.
Como corrigir?
\nUse UIAlertController com o estilo preferido .alert ou .actionSheet. Veja o código correto:
let alert = UIAlertController(title: "Erro",\n message: "Algo deu errado",\n preferredStyle: .alert)\nalert.addAction(UIAlertAction(title: "OK", style: .default))\npresent(alert, animated: true)\n\nLembre-se: no Swift moderno, UIAlertView é legado. Use sempre UIAlertController.
Erro nº 2: Esquecer de chamar present()
\n\nMesmo que você crie um UIAlertController, se esquecer de exibi-lo — nada acontece. Literalmente. O código será executado, o alerta será criado na memória, mas o usuário não o verá.
Exemplo típico do erro:
\n\nfunc showAlert() {\n let alert = UIAlertController(title: "Olá", message: "Mundo", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "OK", style: .default))\n // Esqueceu o present!\n}\n\nResultado: silêncio. Nenhum erro, nenhum alerta. Você ficará se perguntando por que o código não funciona.
\n\nComo corrigir?
\nSempre chame present(_:animated:completion:) no view controller atual:
func showAlert() {\n let alert = UIAlertController(title: "Olá", message: "Mundo", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "OK", style: .default))\n present(alert, animated: true, completion: nil)\n}\n\nDica: se você chamar o alerta de dentro de um closure ou código assíncrono, certifique-se de que self (o view controller) ainda existe. Caso contrário, terá um crash.
Erro nº 3: Tratamento incorreto do toque nos botões
\n\nNo antigo UIAlertView, usávamos o delegate alertView(_:clickedButtonAt:). No UIAlertController é diferente — usamos closures.
Iniciantes frequentemente tentam fazer a classe adotar UIAlertViewDelegate e implementar os métodos do delegate, mas isso não funciona com UIAlertController.
Incorreto:
\n\nclass ViewController: UIViewController, UIAlertViewDelegate {\n func showAlert() {\n let alert = UIAlertController(title: "Pergunta", message: "Você concorda?", preferredStyle: .alert)\n alert.addAction(UIAlertAction(titl