1

I have two UIViewController. First one is a welcome screen and second one is a login screen (which is inside a navigation Controller). Users can go back to welcome screen from login screen with a back button so login screen opens with self.present(LoginViewController(),animated: false) and after Login Screen, final UIViewController opens with appDelegate.window?.rootViewController = FinalViewController().

My problem is that neither LoginViewController or WelcomeViewController deinit at this scenario. However, If I;

  • Open FinalViewController (via changing RootViewController) directly from WelcomeViewController, without showing LoginViewController.
  • Open LoginViewController without showing WelcomeViewController then open FinalViewController (again changing RootViewController)

Controllers deinited. So I don't think any of viewcontroller has a retain cycle vs..

I want to deinit both login and welcome screens after open final controller.

EDIT: I found that putting it inside NavigationController blocks the deniting.

EDIT2: If I call self.dismiss(animated: false, completion: nil) before changing rootViewController. All controllers seems to be deinited but I'm not sure If It will be a better answer. enter image description here

Emre Önder
  • 2,408
  • 2
  • 23
  • 73

1 Answers1

1

Why don't you use this hierarchy:

-UIWindow
-----UIWindow.RootViewController
----------UINavigationController
---------------WelcomeScreen
---------------LoginScreen (Push without animation)

On Login Success:

-UIWindow
-----UIWindow.RootViewController
----------UINavigationController
---------------FinalViewController

Hide navigation bar and use animated property as per need.

EDIT

A part from document:

viewControllerToPresent

The view controller to display over the current view controller’s content.

So reference of the parent controller can be access from presented controller, hence both VCs can access each other. e.g., self.presentedViewController. In order to remove it, one must dismiss controller. So presented controller will release the reference of presenter controller.

NeverHopeless
  • 11,077
  • 4
  • 35
  • 56
  • Because Welcome screen doesn't have a navigation bar. – Emre Önder Jun 25 '18 at 12:37
  • and you are bound to keep it outside navigation controller? – NeverHopeless Jun 25 '18 at 12:39
  • Sorry I don't understand? – Emre Önder Jun 25 '18 at 12:39
  • Why Welcome screen is not inside navigation controller? can you move welcome screen in navigation controller? – NeverHopeless Jun 25 '18 at 12:40
  • Because Welcome screen doesn't have a navigation bar. As you say, I can put it inside navigation controller and hide navigation bar but as I read in this post, It may cause some problems while swiping etc.. https://stackoverflow.com/questions/845583/iphone-hide-navigation-bar-only-on-first-page – Emre Önder Jun 25 '18 at 12:41
  • By the way my final controller is a complicated one which is a UITabberController which has 5 UIViewControllers inside UINavigationController – Emre Önder Jun 25 '18 at 12:47
  • "Users can go back to welcome screen from login screen with a back button so login screen opens with..." Is this custom back button or navigation bar back button ? – NeverHopeless Jun 25 '18 at 13:09