设置 appdelegate' 窗口 rootviewcontroller

Posted

技术标签:

【中文标题】设置 appdelegate\' 窗口 rootviewcontroller【英文标题】:set appdelegate' window rootviewcontroller设置 appdelegate' 窗口 rootviewcontroller 【发布时间】:2013-06-14 10:34:00 【问题描述】:

在基于用户选择的 Home ViewController 中,我必须加载选定的 viewcontroller。为此,我将 AppDelegate.window.rootViewController 更改为使用选定视图控制器启动的导航控制器。

例如:

navigationController = [[UINavigationController alloc] initWithViewController:selectedViewController];
[UIApplication delegate].window.rootviewcontroller = navigationController;

这一切都很好,但我的问题是:从 selectedViewController 我导航到一些 n no.of viewcontrollers,最后我通过设置 appdelegate 的 rootviewcontroller 来加载 HomeViewController。

navigationController = [[UINavigationController alloc] initWithViewController:homeViewController];
[UIApplication delegate].window.rootviewcontroller = navigationController;

这会清除我之前的 navigationController 导航堆栈吗?还是我应该从外部清除阵列?可能解释一下当我们将导航控制器分配给 appdelegate 的窗口 rootviewcontroller 时会发生什么?

请注意,我的应用程序是 6.0 版本。

【问题讨论】:

为什么每次都要重置rootviewcontroller? 好吧,我不应该更改它的现有代码。可能是出于某种目的,但在这里我必须确保在更改 rootviewcontroller 时导航堆栈为空。 【参考方案1】:

导航堆栈由导航控制器维护。因此,如果您创建新的导航控制器 - 它的堆栈显然是空的。 RootViewController 属性定义了谁是应用程序当前窗口中的主视图控制器。因此,替换 rootviewcontroller 将显示新控制器作为此窗口的主控制器。

【讨论】:

【参考方案2】:

没有人可以在不查看您的代码的情况下保证您的代码是否存在内存泄漏。一般来说,当导航控制器被销毁时,它会释放堆栈上的视图控制器。但有时视图控制器可能会保留在代码中,这意味着它们不会被释放,并且会保持活动状态并泄漏内存。

在您的情况下,我强烈建议您分析您的应用。使用XCode instruments,如分配/泄漏。检查视图控制器/导航控制器实例是否应该释放内存。如果内存泄漏,请找出控制器在代码中被保留的位置。

这是来自Raywenderlich's site 的关于如何在代码中查找内存泄漏的好教程。

【讨论】:

以上是关于设置 appdelegate' 窗口 rootviewcontroller的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AppDelegate 中的窗口为零

AppDelegate“意外的零窗口”错误

Swift - 从viewController访问AppDelegate窗口

AppDelegate (OSX) 中主 NSWindow 的引用出口

从 AppDelegate 加载 Storyboard 会在窗口上留下黑色空间

在 Swift 5.0 中从 AppDelegate 实例化窗口失败 [重复]