-1

Je travaille sur un vieux code que je n'ai pas écrit, et il est vraiment pas bien architecturé ...Rejeter contrôleur de vue présenté, après que le contrôleur de vue présentatrice a été libéré

La situation est qu'un contrôleur de vue présente un contrôleur de vue personnalisé modalement, cependant toutes les 30 secondes, le contrôleur de vue de présentation est recréé.

Le problème ici est que si le modal est à l'écran lorsque cela se produit, alors tout effort pour le rejeter entraîne un comportement étrange (comme un écran blanc).

J'ai essayé d'appeler [self.presentedViewController dismissViewControllerAnimated]; sur le contrôleur nouvellement recréé, mais presentedViewController est nul comme vous vous en doutez.

J'ai également essayé de garder une référence faible au contrôleur de vue modale, puis lorsque le VC présentateur est rechargé, en réglant cette valeur sur celle de l'ancien VC. Cela m'a permis d'appeler self.customModalVC dismissViewControllerAnimated]; mais cela provoque l'écran blanc mentionné ci-dessus, peut-être parce qu'il présente VC n'est plus dans la pile?

Toutes les suggestions ont été appréciées.

+0

pourquoi est-il recréé toutes les 30 secondes? Cela me semble un peu étrange. Je vois aussi maintenant comment conserver cette présentation modale sans tenir de référence, ce qui serait probablement dû à des problèmes de mémoire, car il faudrait tenir une référence à viewController. Donc, votre meilleur pari ressemble à refactoriser/changer cela. – zero3nna

+0

C'est en raison des appels réseau, je suis d'accord c'est une façon totalement stupide de le faire. Cela n'aurait pas été mon approche. On dirait que je n'ai pas vraiment beaucoup d'options autres qu'un refactor ... PM va adorer un billet de 4h allant à un billet haha ​​en 3D. –

+0

oui, cela ressemble à un billet amusant à faire. – zero3nna

Répondre

-1

Essayez de passer le contrôleur de navigation nouvellement présenté ViewController:

presentedVC.navigation = self.navigationController 

Ajoutez ceci à nouveau un pour rejeter

self.dismiss(animated: false) { 
       _ = self.navigation?.popViewController(animated: true) 
      } 
+0

La propriété 'navigationController' de' UIViewController' est en lecture seule. –

+0

De plus, les présentations modales sont mutuellement exclusives de la pile de navigation, et par conséquent, il n'y a pas de "popping" et de "pushing". –

-1

Je pense que vous devriez d'abord vous présenter contrôleur de vue, il sera le dernier sur la hiérarchie de la pile et appelez dismiss sur lui, puis supprimez le contrôleur qui était parent how to get top controller see here

+0

J'ai déjà une référence au contrôleur de vue présenté, comme je le dis très clairement dans la question. J'appelle rejeter et il en résulte un comportement étrange. Assurez-vous de lire attentivement la question. –

+0

Ok, désolé, ouvert à partir de mobiles et quelque chose a raté. Quoi qu'il en soit, expliquez s'il vous plait ce que vous entendez par "recréer" le contrôleur. Et pourquoi vous n'avez pas rejeté le contrôleur de vue présenté avant de recréer, sinon votre vc présenté devrait savoir à ViewControlle-sur lequel il a été présenté et apparaîtra après avoir rejeté –

+0

Ok, désolé, ouvert à partir de mobile et quelque chose a manqué. Quoi qu'il en soit, expliquez s'il vous plait ce que vous entendez par "recréer" le contrôleur. Et pourquoi vous n'avez pas rejeté le contrôleur de vue présenté avant de recréer, sinon votre vc présenté devrait savoir à ViewControlle-sur lequel il a été présenté et apparaîtra après avoir rejeté-présenté un –