在Swift

时间:2018-06-25 12:18:33

标签: ios swift

我有两个UIViewController。第一个是欢迎屏幕,第二个是登录屏幕(位于导航控制器内部)。用户可以使用后退按钮从登录屏幕返回欢迎屏幕,因此登录屏幕将以self.present(LoginViewController(),animated: false)打开,登录屏幕之后,最后的UIViewController将以appDelegate.window?.rootViewController = FinalViewController()打开。

我的问题是,在这种情况下LoginViewControllerWelcomeViewController都不会取消初始化。但是,如果我;

  • 直接从FinalViewController打开WelcomeViewController(通过更改RootViewController),而不显示LoginViewController
  • 打开LoginViewController而不显示WelcomeViewController,然后打开FinalViewController(再次更改RootViewController)

控制器已初始化。因此,我认为Viewcontroller中的任何一个都不具有保留周期。

在打开最终控制器后,我想取消登录和欢迎屏幕。

编辑:我发现将其放入NavigationController会阻止反硝化。

EDIT2 :如果我在更改rootViewController之前致电self.dismiss(animated: false, completion: nil)。所有控制器似乎都已取消初始化,但是我不确定是否会更好。 enter image description here

1 个答案:

答案 0 :(得分:1)

为什么不使用此层次结构:

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

登录成功:

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

隐藏导航栏,并根据需要使用animated属性。

编辑

document的一部分:

  

viewControllerToPresent

     

用于在当前视图控制器的内容上显示 的视图控制器。

因此,对父控制器的引用可以从所提供的控制器进行访问,因此两个VC可以相互访问。例如self.presentedViewController。为了删除它,必须关闭控制器。因此,演示者控制器将释放演示者控制器的参考。