Сообщение "Ожидается, что окна приложений будут иметь контроллер корневого представления" при добавлении представления сразу после запуска, только для iOS 9
Мое приложение отправляет запрос при запуске и отображает краткое сообщение для пользователей, когда оно успешно, с помощью MTStatusBarOverlay
, К сожалению, моя текущая реализация, похоже, противоречит парадигмам представления жизненного цикла iOS 9. Я получаю сообщение
Ожидается, что окна приложений будут иметь контроллер корневого представления в конце запуска приложения.
и приложение вылетает. Приложение отлично работает на 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 от приложения?
1 ответ
MTStatusBarOverlay
это подкласс UIWindow
Таким образом, создание экземпляра во время запуска приложения добавляет, что UIWindow
в список, который iOS проверяет на заполненность rootViewController
когда запуск завершится.
Я смог обойти эту проблему, создав экземпляр и назначив фиктивный контроллер перед использованием наложения, например так:
[MTStatusBarOverlay sharedInstance].rootViewController = [UIViewController new];
[[MTStatusBarOverlay sharedInstance] postMessage:@"Message"];