UIWindow setRootViewController不清除现有层次结构

Naz*_*Mir 7 uikit uiview ios ios8

在我的应用程序中,我以编程方式根据用户操作(例如登录/注销功能)更改根视图控制器.

在iOS 8中 - 我注意到一个奇怪的问题.即使在窗口上设置rootViewController之后,旧的层次结构仍然存在.我只是通过捕获视图层次结构来验证它.

- (void) logout{
     [self.window setRootViewController:[self loadLoginView]];
}

-(UIViewController *) loadLoginView{
      WelcomeScreenVC *wsVC;
      wsVC = [[WelcomeScreenVC alloc] initWithNibName:@"WelcomeScreenVC" bundle:nil];
      UINavigationController *onboardingVC = [[UINavigationController alloc]initWithRootViewController:wsVC];
      return onboardingVC;
 }
Run Code Online (Sandbox Code Playgroud)

即使在执行此行代码后,旧的登录视图层次结构仍然存在.如果有人能够提出幕后发生的事情,我将不胜感激.

编辑:我只看了UIWindow setRootViewController文档,这里是Apple对它的评价:

根视图控制器提供窗口的内容视图.将视图控制器分配给此属性(以编程方式或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图.如果窗口具有现有视图层次结构,则在安装新视图之前将删除旧视图.

小智 2

我也注意到了同样的事情。

基本上,我有一个相当复杂的故事板,充当登录/欢迎界面。该界面位于导航控制器中,该控制器以模态方式呈现另一个导航控制器。

在某一点之后,用户执行将他转换到主界面的操作。使用 iOS 8 视图调试器,我注意到在设置窗口的 rootViewController 属性后,旧的视图层次结构仍然存在。

我的解决方案目前是在重新分配 window.rootViewController 属性之前使用以下代码:

for (UIView* subView in self.window.rootViewController.view.subviews) {
    [subView removeFromSuperview];
}
[self.window.rootViewController.view removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

它不漂亮,但很有效。

我注意到的另一个奇怪的事情是,欢迎界面的模态呈现的 viewController 没有使用此方法正确清理。我必须手动关闭它并进行清理。