Bonjour tout le monde,
J’essaye de mettre en place des alertes dans mon application (de type UIAlertController).
Tout fonctionne bien, si ce n’est que j’ai ce petit warning dans ma console:
Presenting view controllers on detached view controllers is discouraged
Et mon code:
override func viewWillAppear(_ animated: Bool) {
self.present(alert, animated: true, completion: nil)
}
Que puis-je faire pour résoudre ce petit soucis?
J’ai trouvé quelques réponses en ObjectiveC, mais impossible de faire pareil en Swift…
Et quand j’essaye de faire comme certains recommande:
self.view.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
mon alerte ne s’affiche pas…
Une idée?
Bonne fin de journée 
Alexandre
Réponse à moi-même; le soucis vient peut-être du fait que j’ai demandé l’affichage de l’alerte dans un viewWillAppear?
Je n’ai plus cette erreur si je la mets autre part…
(Si vous avez une explication, je prends
)
Hello Alexandre,
Je n’utilise des UIAlertController qu’associés avec des boutons donc c’est plutôt facile de les gérer puisqu’ils sont contenus dans les IBAction.
Maintenant, ce qui est bizarre c’est que mettre ça dans le viewWillAppear. Chez moi (après, je ne sais pas si je les utilise exactement comme il fait), le viewWillAppear me sert à faire des ajustements d’UI avant que tout se charge. Donc je ne comprends pas bien pourquoi faire apparaître une alerte avant que ta vue se charge ?
Hello @schtipoun 
Oui, je suis d’accord que c’est bizarre de le mettre dans le viewWillAppear, en fait, je l’avais mis là pour mes tests (ainsi, je lance l’application, mon alerte se déclenche direct, pour ne pas devoir cliquer), mais après je l’ai déplacé, et il n’est finalement plus dans un viewWillAppear (ou autre méthode gérant la vue directement).
Je me posais juste la question du pourquoi cette erreur parce que je suis curieux 
A mon avis, mais ça demande à être vérifié, la plupart du temps, les UIAlert dans la partie “handler” tu viens leur passer une action comme une segue ou l’ouverture d’une autre application ou d’une page web, etc.
Et je pense que du coup XCode vient afficher un warning en mode “Tu as du code dans tes UIAlert qui font potentiellement quitter ce view controller avant même que le code qu’il contient ne soit exécuté”.
D’où un peu le message de découragement de présenter des view controllers détachés à ce moment là.
Mmh, alors, dans le cas où je mets un UIAlert avec une action qui permet juste de quitter ce UIAlert (fermer l’alerte), je ne devrais pas avoir ce message, si ?
Je vais tester pour voir 
Si je mets ce code:
let alert = UIAlertController(title: "Test", message: "Contenu de l'alerte", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Fermer", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
J’obtiens ceci:
2017-11-28 17:00:23.163111+0100 RunRunRun[16112:622314] Warning: Attempt to present <UIAlertController: 0x7fb02301a200> on <RunRunRun.ControlCenterViewController: 0x7fb020c12190> whose view is not in the window hierarchy!
Pourtant, je n’ai aucun code dans mon handler… ^^
Bonne question, à voir 
Sinon, c’est peut-être aussi que ton view controller n’est pas rattaché à une hiérarchie. Et comme cette information n’est dispo qu’après avoir exécuté le viewDidLoad ou viewDidAppear, il ne sait pas où placer ce view controller dans la hiérarchie !
Update-- Hahaha, marrant, j’ai écrit la réponse avant de voir la tienne 
Oui en fait c’est ça. J’ai testé pour voir avec une de mes vues et ça m’a fait ce message.
Parce qu’en fait dans la stack de l’affichage Xcode est un peu perdue car tu lui demanderais via ta vue détachée, d’afficher quelque chose avant la vue que tu es en train de charger.
Donc ça fonctionne au final mais c’est déconseillé. Je pense que le message s’adresse surtout à ceux qui ne l’auraient pas fait volontairement et se retrouve à afficher une vue détachée avant la principale.
1 « J'aime »
Ok, super, merci 
Là où je l’ai mis maintenant, il n’y a plus ce problème, mais ainsi, je sais d’où vient ce warning !
Encore merci ! 
1 « J'aime »
J’arrive après la guerre mais je vous confirme ce que vous avez finit par découvrir via vos investigations 
Dans la fonction viewWillAppear
, la vue du ViewController n’est pas encore affichée (d’où le will
), elle n’est donc pas dans la hiérarchie des vues présentes à l’écran.
Demander à une vue non affichée d’en afficher une autre (ton ‘UIAlertController’) ne fait pas trop de sens, d’où le warning.
1 « J'aime »