UIAlertView en Swift : 5 erreurs fatales et comment les éviter

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi votre UIAlertView ne fonctionne pas (et le rôle de Stack Overflow)

\n\n

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

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

Erreur n°1 : Utiliser UIAlertView au lieu de UIAlertController

\n\n

L'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 :

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

Pourquoi cela se produit-il ?

\n

Apple 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.

\n\n

Comment corriger ?

\n

Utilisez UIAlertController avec le style préféré .alert ou .actionSheet. Voici le code correct :

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

\n\n

Erreur n°2 : Oublier d'appeler present()

\n\n

Mê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.

\n\n

Exemple typique d'erreur :

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

Résultat : rien. Pas d'erreur, pas d'alerte. Vous vous demanderez pourquoi le code ne fonctionne pas.

\n\n

Comment corriger ?

\n

Appelez toujours present(_:animated:completion:) sur le contrôleur de vue actuel :

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

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

\n\n

Erreur n°3 : Mauvaise gestion des appuis sur les boutons

\n\n

Avec l'ancien UIAlertView, on utilisait le délégué alertView(_:clickedButtonAt:). Avec UIAlertController, tout est différent : on utilise des closures.

\n\n

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.

\n\n

Incorrect :

\n\n
class ViewController: UIViewController, UIAlertViewDelegate {\n    func showAlert() {\n        let alert = UIAlertController(title: "Question", message: "Êtes-vous d'accord ?", preferredStyle: .alert)\n        alert.addAction(UIAlertAction(titl

Blogs

Book Recommendations