"Application windows are expected to have a root view controller" 启动后立即添加视图时的消息,仅 iOS 9

"Application windows are expected to have a root view controller" message when adding view immediately after launch, iOS 9 only

我的应用程序在启动时发送请求,并在成功时向用户显示一条简短消息,方法是 MTStatusBarOverlay。不幸的是,我当前的实现似乎 运行 与 iOS 9 的视图生命周期范例相冲突。我收到消息

Application windows are expected to have a root view controller at the end of application launch

然后应用程序崩溃了。该应用程序在 iOS 7 和 8 上运行良好。

通过在线搜索,似乎在为应用程序 UIWindow 建立根视图控制器之前尝试将消息视图添加到视图层次结构时可能会发生这种情况,但这似乎并没有发生就是这里的情况,见下文。

这里是 UIApplicationDelegate 实现的摘录:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [...]

    self.window.rootViewController = [[MyViewController alloc] init];

    [...]
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [MyDataManager sendRequestWithCompletion:^{
        // Displays a message with MTStatusBarOverlay
        [self showSuccessOverlay];
    }];
}

application:didFinishLaunchingWithOptions:applicationDidBecomeActive: 之前被调用,所以似乎 rootViewController 的建立永远不会有问题。

为什么会这样?导致应用程序崩溃的 iOS 9 有何不同?

MTStatusBarOverlayUIWindow 的子类,因此在应用程序启动期间实例化一个将 UIWindow 添加到 iOS 检查填充的 rootViewController 启动完成时。

我能够通过在使用覆盖之前实例化和分配一个虚拟控制器来解决这个问题,如下所示:

[MTStatusBarOverlay sharedInstance].rootViewController = [UIViewController new];
[[MTStatusBarOverlay sharedInstance] postMessage:@"Message"];