2017-08-09 5 views
0

J'ai un contrôleur de vue qui est un contrôleur de vue enfant du contrôleur de vue racine de ma fenêtre. Ce contrôleur de vue enfant a une vue de table et lorsque je sélectionne une ligne, il indique au contrôleur de vue parent de présenter un contrôleur de vue de manière modale. Le contrôleur de vue modale, cependant, n'apparaît jamais. J'ai créé un contrôleur de vue de test des os nus qui imprime juste viewDidLoad et viewWillAppear. Ce que je remarque est que lorsque j'appelle parentVC.present(testVC, animated:true, completion:nil), viewDidLoad est exécuté, mais viewWillAppear ne l'est pas. viewWillAppear n'est appelé que lorsque j'interagis avec l'interface utilisateur d'une manière ou d'une autre. Que ce soit tapant, panoramique, défilement ou peu importe. J'ai passé des heures à essayer de déboguer cela. Il ne semble pas que la file d'attente principale est bloquée et j'ai réduit le problème à ses os nus. Le contrôleur viewWillAppear du contrôleur de vue présenté de manière modale n'est simplement pas appelé jusqu'à ce que j'interagisse à nouveau avec l'interface utilisateur.ViewController Modal Présentation n'apparaît pas

Quels pourraient causer ce symptôme?

+0

Devrions-nous pouvoir le deviner sans code? –

+0

vous avez peut-être défini this 'parentVC.present (testVC, animé: true, completion: nil)' dans la file d'attente asynchrone de répartition. Partagez votre code. – Krunal

+0

@Rob queue principale était la première chose que je pensais et vérifié pour .. J'ai jeté cela affirmer dans une bonne mesure et aucune exception. c'est sur le fil principal. –

Répondre

0

Dans les commentaires, vous mentionnez que vous instancier votre contrôleur de vue avec

let vc = TestVC() 

TestVC est sans doute un (en grande partie vide) UIViewController sous-classe.

Un contrôleur de vue a besoin d'une vue créée soit par une ou l'autre scène story-board (en utilisant instantiateViewController), un NIB ou, dans des cas très rares, une vue que vous créez dans loadView (que vous ne devriez pas être confondu avec viewDidLoad).

Je vous suggère de créer une scène story-board (en supposant que vous utilisez storyboards), donnez-lui une pièce d'identité story-board, puis utilisez instantiateViewController:

let vc = storyboard.instantiateViewController(withIdentifier: "foo") 

Mais ayant une sous-classe UIViewController appelé TestVC et instanciation avec TestVC() ne fonctionnera pas. Dans notre discussion, vous avez dit que vous vouliez le faire par programmation sans NIB ni storyboard. Si oui, utilisez loadView. Voir https://stackoverflow.com/a/37964249/1271826 pour un exemple.