Introduction : pourquoi votre UIAlertView ne fonctionne pas (et le rôle de Stack Overflow)
\n\nSi vous avez déjà cherché sur Google « How would I create a UIAlertView in Swift? », vous n'êtes pas seul. Cette question sur Stack Overflow cumule des centaines de milliers de vues. Pourtant, quoi de plus simple ? Afficher une fenêtre contextuelle avec un bouton « OK ». Mais en pratique, les débutants (et même les plus expérimentés) tombent dans les mêmes pièges.
\n\nDans cet article, nous analysons les 5 erreurs les plus fréquentes lors de la création d'une UIAlertView en Swift, nous montrons comment les corriger et vous fournissons le code prêt à l'emploi pour UIAlertController — le remplacement moderne de l'API obsolète. Si vous voulez écrire un code propre et fonctionnel sans crash, restez avec nous.
\n\nErreur n°1 : Utiliser UIAlertView au lieu de UIAlertController
\n\nL'erreur la plus courante est d'essayer d'appeler UIAlertView dans du Swift moderne. Cette classe a été déclarée obsolète (deprecated) depuis iOS 8. Si vous écrivez :
let alert = UIAlertView(title: "Erreur", message: "Quelque chose s'est mal passé", delegate: nil, cancelButtonTitle: "OK")\nalert.show()\n\n…le compilateur affichera probablement un avertissement ou une erreur. Et si le projet se compile, l'alerte risque de ne pas fonctionner correctement sous iOS 13+.
\n\nPourquoi cela se produit-il ?
\nApple a remplacé UIAlertView par UIAlertController dès iOS 8. L'ancienne classe n'est plus prise en charge et son utilisation peut entraîner un comportement imprévisible.
Comment corriger ?
\nUtilisez UIAlertController avec le style préféré .alert ou .actionSheet. Voici le code correct :
let alert = UIAlertController(title: "Erreur",\n message: "Quelque chose s'est mal passé",\n preferredStyle: .alert)\nalert.addAction(UIAlertAction(title: "OK", style: .default))\npresent(alert, animated: true)\n\nÀ retenir : dans le Swift moderne, UIAlertView est un vestige. Utilisez toujours UIAlertController.
Erreur n°2 : Oublier d'appeler present()
\n\nMême si vous avez créé un UIAlertController, si vous oubliez de l'afficher, rien ne se passera. Littéralement. Le code s'exécutera, l'alerte sera créée en mémoire, mais l'utilisateur ne la verra pas.
Exemple typique d'erreur :
\n\nfunc showAlert() {\n let alert = UIAlertController(title: "Bonjour", message: "Le monde", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "OK", style: .default))\n // Oubli du present !\n}\n\nRésultat : rien. Pas d'erreur, pas d'alerte. Vous vous demanderez pourquoi le code ne fonctionne pas.
\n\nComment corriger ?
\nAppelez toujours present(_:animated:completion:) sur le contrôleur de vue actuel :
func showAlert() {\n let alert = UIAlertController(title: "Bonjour", message: "Le monde", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "OK", style: .default))\n present(alert, animated: true, completion: nil)\n}\n\nConseil : si vous appelez l'alerte depuis une closure ou du code asynchrone, assurez-vous que self (le contrôleur de vue) existe encore. Sinon, vous obtiendrez un crash.
Erreur n°3 : Mauvaise gestion des appuis sur les boutons
\n\nAvec l'ancien UIAlertView, on utilisait le délégué alertView(_:clickedButtonAt:). Avec UIAlertController, tout est différent : on utilise des closures.
Les débutants essaient souvent de faire adopter le protocole UIAlertViewDelegate à leur classe et d'implémenter les méthodes du délégué, mais cela ne fonctionne pas avec UIAlertController.
Incorrect :
\n\nclass ViewController: UIViewController, UIAlertViewDelegate {\n func showAlert() {\n let alert = UIAlertController(title: "Question", message: "Êtes-vous d'accord ?", preferredStyle: .alert)\n alert.addAction(UIAlertAction(titl