UIAlertView em Swift: 5 erros fatais e como evitá-los

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que seu UIAlertView não funciona (e o que o Stack Overflow tem a ver com isso)

\n\n

Se 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\n

Neste 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\n

Erro nº 1: Usar UIAlertView em vez de UIAlertController

\n\n

O erro mais comum é tentar chamar UIAlertView no Swift moderno. Essa classe foi descontinuada (deprecated) desde o iOS 8. Se você escreve:

\n\n
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\n

Por que isso acontece?

\n

A Apple substituiu UIAlertView por UIAlertController já no iOS 8. A classe antiga não é mais suportada e seu uso pode causar comportamentos inesperados.

\n\n

Como corrigir?

\n

Use UIAlertController com o estilo preferido .alert ou .actionSheet. Veja o código correto:

\n\n
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\n

Lembre-se: no Swift moderno, UIAlertView é legado. Use sempre UIAlertController.

\n\n

Erro nº 2: Esquecer de chamar present()

\n\n

Mesmo 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á.

\n\n

Exemplo típico do erro:

\n\n
func 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\n

Resultado: silêncio. Nenhum erro, nenhum alerta. Você ficará se perguntando por que o código não funciona.

\n\n

Como corrigir?

\n

Sempre chame present(_:animated:completion:) no view controller atual:

\n\n
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\n

Dica: 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.

\n\n

Erro nº 3: Tratamento incorreto do toque nos botões

\n\n

No antigo UIAlertView, usávamos o delegate alertView(_:clickedButtonAt:). No UIAlertController é diferente — usamos closures.

\n\n

Iniciantes frequentemente tentam fazer a classe adotar UIAlertViewDelegate e implementar os métodos do delegate, mas isso não funciona com UIAlertController.

\n\n

Incorreto:

\n\n
class ViewController: UIViewController, UIAlertViewDelegate {\n    func showAlert() {\n        let alert = UIAlertController(title: "Pergunta", message: "Você concorda?", preferredStyle: .alert)\n        alert.addAction(UIAlertAction(titl                

Blogs

Book Recommendations