Предполагается, что в конце запуска приложения ожидается контроллер корневого представления

В моей консоли появляется следующая ошибка:

Ожидается, что в конце запуска приложения ожидается контроллер корневого представления

Ниже мой метод application:didFinishLaunchWithOptions:

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

    // Set Background Color/Pattern
    self.window.backgroundColor = [UIColor blackColor];
    self.tabBarController.tabBar.backgroundColor = [UIColor clearColor];
    //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]];

    // Set StatusBar Color
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

    // Add the tab bar controller current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

В Interface Builder делегат UITabBarController подключается к App Delegate.

Кто-нибудь знает, как исправить эту проблему?

Ответ 1

У меня была такая же проблема. Проверьте свой главный .m. Последнему аргументу должно быть присвоено имя класса, реализующего протокол UIApplicationDelegate.

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");

Ответ 2

Заменить в AppDelegate

 [window addSubview:[someController view]];

к

  [self.window setRootViewController:someController];

Ответ 3

У меня была такая же ошибка при попытке изменить первый контроллер представления, который был загружен в

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Сначала я не знал, где именно происходит ошибка, поэтому я сузил ее и выяснил, что пошло не так. Оказывается, я пытался изменить отображение представления до того, как оно действительно появилось на экране. Поэтому решение заключалось в том, чтобы переместить этот код в диспетчере представлений, который вызывал у меня проблемы с

- (void)viewDidLoad

к

- (void)viewDidAppear:(BOOL)animated

и ошибка перестала появляться. Моя проблема была вызвана, например, созданием UIAlertView.

В вашем случае я предлагаю вам проверить код в контроллере активного вида tabBarController (поскольку это, вероятно, проблема в этом контроллере представления). Если это не сработает, попробуйте установить начальные настройки в файле nib вместо кода - или если вы хотите сделать это в коде, попробуйте переместить код в соответствующий метод управления viewBarController.

Удачи!

Ответ 4

Это случилось со мной. Решено путем редактирования файла .plist. Укажите базовое имя основного файла nib (должно быть MainWindow.xib). Надеюсь, это поможет.

enter image description here

Ответ 5

Я получил это, начиная с шаблона "Пустое приложение", а затем вручную добавляя XIB. Я решил это, установив основное имя Nib, предложенное Sunny. Отсутствующий шаг в этом сценарии удаляет

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

от

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Так как он перезапишет экземпляр вашего окна, созданного в файле Xib. Предполагается, что вы создали ViewController и подключили его к окну и делегату приложения в файле XIB.

Ответ 6

Я сталкиваюсь с той же проблемой в последнее время при создании проекта с помощью ios5 sdk. Сначала он строился и работал должным образом, но после этого появилась ошибка.
В моем случае решение было довольно простым.
Недостатки заключались в том, что каким-то образом свойство Основной интерфейс на вкладке сводки моего целевого приложения было стерто. Поэтому мне нужно было снова установить его.


Если это не так, и если tabBarController по-прежнему равен нулю, вы всегда можете программно создать свой оконный и корневой контроллер. В качестве резерва я добавил следующий код в свой проект

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ 
    if (!window && !navigationController) {
        NSLog(@"Window and navigation controller not loaded from nib. Will be created programatically.");
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        UIViewController *viewController1, *viewController2;
        viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
        viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

        self.tabBarController = [[[UITabBarController alloc] init] autorelease];
        self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
        self.window.rootViewController = self.tabBarController;

    }
    else {
        [window addSubview:[tabBarController view]];
    }
    [self.window makeKeyAndVisible];
    return YES;
}

Это будет работать только в том случае, если также будет реализовано решение sho.

Ответ 7

Я обновился до iOS9 и начал получать эту ошибку из ниоткуда. Я смог его исправить, но добавив код ниже - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}

Ответ 8

Ни одно из вышеперечисленных предложений не решило мою проблему. Мой был следующим:

Добавить

window.rootViewController = navigationController;

после

[window addSubview:navigationController.view];

в моем appdelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {

Ответ 9

  • Выберите свое "окно" в файле Nib.
  • В "Инспекторе атрибутов" Установите флажок "Видимый при запуске"

image![]

  • Это происходит, когда ваш файл nib создается вручную.
  • Это исправление работает для обычного режима nib, а не для режима раскадровки.

Ответ 10

как добавить RootViewController для iOS5

если ваше приложение до сих пор не использовало RootViewController, просто создайте один;), нажав "Файл" > "Создать" > "Новый файл"; выберите UIViewController subclass назовите его RootViewController, снимите флажок С XIB для пользовательского интерфейса (если у вас его уже есть) и поместите этот код в свой AppDelegate:: didFinishLaunchingWithOptions

rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;

наверняка - вам нужно импортировать RootViewController.h и создать переменную

вот хорошая статья о RootViewController и AppDelegate,

Ответ 11

Убедитесь, что у вас есть эта функция в делетете приложения.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
   return YES;
}

Убедитесь, что didFinishLaunchingWithOptions возвращает YES. Если вам удалили строку "return YES", это приведет к ошибке. Эта ошибка может быть особенно распространена среди пользователей раскадровки.

Ответ 12

У меня также была эта ошибка, но в отличие от любых ответов, перечисленных ранее, это потому, что я раскомментировал метод loadView в моем новом генераторе (xcode 4.2, ios5).

 //Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView  
{
}

Он даже сказал мне, что метод предназначен для создания представления программно, но я пропустил его, потому что он выглядел так же, как и другие методы, такие как viewDidLoad, которые я обычно использую, я его не поймал.

Чтобы решить, просто удалите этот метод, если вы не программно создаете иерархию представлений aka, используя nib или раскадровку.

Ответ 13

У меня тоже есть проблемы. Я получил проект в xcode4.2.1. Я прочитал все комментарии там, но никто не классный для меня. через некоторое время я обнаружил, что я прокомментировал фрагмент кода.

//self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

то я расколол его. все в порядке для меня. надеюсь, это поможет вам, ребята.

Ответ 14

Произошло небольшое изменение вокруг iOS 5.0 или около того, требуя, чтобы у вас был контроллер корневого представления. Если ваш код основан на старом образце кода, например GLES2Sample, в этом образце кода не было создано контроллера корневого представления.

Чтобы исправить (например, GLES2Sample), прямо в applicationDidFinishLaunching, я создаю контроллер корневого представления и присоединяю к нему glView.

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
  // To make the 'Application windows are expected
  // to have a root view controller
  // at the end of application launch' warning go away,
  // you should have a rootviewcontroller,
  // but this app doesn't have one at all.
  window.rootViewController = [[UIViewController alloc] init];  // MAKE ONE
  window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE
  // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS
}

Это заставляет предупреждение уйти и на самом деле не влияет на ваше приложение.

Ответ 15

Попробуйте подключить IBOutlet контроллера панели вкладок к корневому представлению в Interface Builder вместо

self.window.rootViewController = self.tabBarController;

Но на самом деле я не видел такую ​​ошибку раньше.

Ответ 16

С моим первым представлением MenuViewController я добавил:

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;

в методе делегирования приложения:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}

Это сработало.

Ответ 17

Я решил проблему, выполнив следующее (ни одно из вышеперечисленных решений не помогло):

Из раскрывающегося меню, связанного с "Основным интерфейсом", выберите другую запись, а затем повторно выберите "MainWindow", затем перестройте.

enter image description here

Ответ 18

Я столкнулся с той же проблемой, но использовал storyboard

Назначение my storyboard InitialViewController моему окну rootViewController.

В

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [stb instantiateInitialViewController];
return YES;
}

и это решило проблему.

Ответ 19

У меня возникла такая же проблема сразу после обновления до Xcode 4.3, и только при запуске проекта с нуля (т.е. создайте пустой проект, затем создайте UIViewController, а затем создайте отдельный файл nib).

После размещения всех строк, которые я использовал, и обеспечения правильных подключений, я продолжал получать эту ошибку, и файл nib, который я пытался загрузить через контроллер вида (который был установлен как rootController), никогда не показывался в симулятор.

Я создал единый шаблон представления через Xcode и сравнил его с моим кодом и НАКОНЕЦ нашел проблему!

Xcode 4.3 добавляет по умолчанию метод - (void) loadView; к разделу реализации контроллера просмотра. После тщательного чтения комментариев внутри него стало ясно, в чем проблема. Комментарий указывает на переопределение метода loadView при программном программировании (и я перефразирую), иначе НЕ переопределить loadView при использовании ниба. В этом методе ничего больше не было, поэтому во вред я переопределял метод (и ничего не делал) WHILE, используя файл nib, который дал ошибку.

РЕШЕНИЕ заключалось в том, чтобы полностью удалить метод loadView из раздела реализации или вызвать родительский метод, добавив [super loadView].

Удаление было бы лучше, если бы использование файла NIB, поскольку добавление какого-либо другого кода действительно заменит его.

Ответ 20

В журнале было такое же сообщение об ошибке. У меня появилось UIAlertView в приложении: didFinishLaunchingWithOptions. Я решил это, отложив вызов alertView, чтобы дать возможность контроллеру корневого представления завершить загрузку.

В приложении: didFinishLaunchingWithOptions:

[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];

который вызывает через 1 секунду:

- (void)callPopUp
{
    // call UIAlertView
}

Ответ 21

У меня была та же проблема. Если вы создаете оконное приложение "с нуля", как и я, вам нужно сделать следующее: (обратите внимание, что это шаги для Xcode 4.2.)

0. Убедитесь, что ваш делегат приложения соответствует протоколу UIApplicationDelegate.

Например, предположим, что наш делегат называется MyAppDelegate. В MyAppDelegate.h у нас должно быть что-то вроде этого:

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. Укажите делегат приложения в main.m

Например,

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv,
      nil, NSStringFromClass([MyAppDelegate class]));
  }
}

2. Создайте файл интерфейса главного окна.

Для этого щелкните правой кнопкой мыши проект и выберите "Новый файл". Оттуда выберите "Окно" в разделе iOS → "Пользовательский интерфейс".

После добавления файла в ваш проект перейдите к резюме проекта (щелкните левой кнопкой мыши по проекту, нажмите "Обзор" ). В разделе "Информация о развертывании iPhone/iPod" (и соответствующем разделе iPad, если хотите) и выберите новый файл интерфейса в поле "Основной интерфейс".

3. Подключите все это в редакторе интерфейса

Выберите файл интерфейса в списке файлов, чтобы открыть редактор интерфейса.

Убедитесь, что панель "Утилиты" открыта.

Добавьте новый объект, перетащив объект из списка "Объекты" на панели "Утилиты" в пространство выше вашего объекта "Окно". Выберите объект. Нажмите "Инспектор удостоверений" на панели "Утилиты". Измените класс на делегат приложения (MyAppDelegate, в этом примере.)

Подключите инспектор соединений для MyAppDelegate. Подключите выход окна к окну, которое уже существует в файле интерфейса.

Нажмите "Владелец файла" слева, а затем нажмите "Инспектор удостоверений" на панели "Утилиты". Измените класс на UIApplication

Подключите инспектор соединений для владельца файла. Подключите выход делегата к объекту MyAppDelegate.

4. Наконец, и очень важно, щелкните объект Window в файле интерфейса. Откройте инспектор атрибутов. Убедитесь, что установлен флажок "Видимый при запуске".

Это все, что я должен был сделать, чтобы заставить его работать на меня. Удачи!

Ответ 22

Если вы используете MTStatusBarOverlay, вы получите эту ошибку.

MTStatusBarOverlay создает дополнительное окно (окна [UIApplication sharedApplication]), в котором нет корневого контроллера.

Это не вызывает проблем.

Ответ 23

Получена такая же ошибка после замены моего пользовательского интерфейса с помощью раскадровки, используя XCode 4.6.3 и iOS 6.1

Решил его, очистив весь код от didFinishLaucnhingWithOptions в AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}

Ответ 24

OrdoDei дал правильный и ценный ответ. Я добавляю этот ответ только для того, чтобы привести пример метода didFinishLaunchingWithOptions, который использует его ответ, а также для учета других комментариев относительно контроллера навигации.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    // Instantiate the main menu view controller (UITableView with menu items).
    // Pass that view controller to the nav controller as the root of the nav stack.
    // This nav stack drives our *entire* app.
    UIViewController *viewController = [[XMMainMenuTableViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    // Instantiate the app window. Then get the nav controller view into that window, and onto the screen.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // [self.window addSubview:self.navigationController.view];
    // The disabled line above was replaced by line below. Fixed Apple complaint in log: Application windows are expected to have a root view controller at the end of application launch
    [self.window setRootViewController:self.navigationController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

Ответ 25

Это произошло для меня, потому что я непреднамеренно закомментировал:

[self.window makeKeyAndVisible];

от

- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)

Ответ 26

Мне удалось установить начальный контроллер представления на сводном экране xcode.

Нажмите на самое верхнее имя проекта в левом файловом проводнике (у него должен быть небольшой значок). В центральном столбце щелкните название вашего проекта в разделе "TARGETS" (рядом с ним должен быть маленький значок "A" ). Посмотрите раздел "Информация о развертывании iPhone/iPod" и найдите "Основной интерфейс". Вы можете выбрать вариант из раскрывающегося списка.

Ответ 27

В верхней части ответа "sho", это правильно (четвертый параметр UIApplicationMain должен быть именем основного контроллера), я добавляю несколько комментариев.

Недавно я изменил "модель" приложения my из MainWindow.xib, чтобы построить окно программно. В приложении использовался более старый шаблон, который автоматически создавал этот MainWindow. Поскольку я хотел поддерживать другой вид контроллера XIB для iPhone 5, проще выбрать правильный XIB программно, когда будет создан делегат приложения. Я также удалил MainWindow.xib из проекта.

Проблема заключалась в том, что я забыл заполнить четвертый параметр в главном UIApplication, и я ЗАБЫЛ ОТКЛЮЧИТЬ MainWindow из "основного интерфейса" в резюме проекта.

Это вызвало проблему BIG: это обеспечило безобидное предупреждение "Приложения, ожидаемые..." на устройствах разработки, но когда оно пошло в App Store, оно сломалось на потребительских телефонах, сбой, потому что MainWindow больше не был в комплекте! Мне пришлось запросить ускоренную проверку исправления.

Другой симптом заключается в том, что иногда белый блок, как пустой UIView, иногда появлялся при изменении настроек, и приложение было помещено на передний план. В iPhone 5 было ясно, что это блок 320x480. Возможно, отсутствующий MainWindow создавался в режиме разработки, используя старый размер. Я только что нашел эту ошибку, когда первые сообщения об аварии достигли папки "Входящие".

Установка приложения из App Store вместо XCode показала, что приложение действительно разбилось, и проблема MainWindow обнаружила себя в журнале, поэтому я мог видеть, что это не какая-то особая комбинация устройств + версии IOS.

Ответ 28

Чтобы добавить к Mike Flynn ответ, начиная с обновления до Xcode 7 и запуска моего приложения на устройстве iOS 9, я добавил это в свой (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// Hide any window that isn't the main window
NSArray *windows = [[UIApplication sharedApplication] windows];
for (UIWindow *window in windows) {
    if (window != self.window) {
        window.hidden = YES;
    }
}

Ответ 29

Эта проблема возникает, если вы неправильно настроили Interface Builder.

Убедитесь, что вы открыли окно App Delegate и viewController:

В MainWindow.xib, удерживайте элемент управления, щелкните App Delegate и перетащите объект Window. Выберите окно. Удерживайте управление и снова выберите делегата приложения, перетащите его на контроллер корневого представления и выберите viewController.

Ответ 30

Эта ошибка также появляется, когда владелец файла MainWindow.xib установлен неверно.

Владелец файла - это UIApplication
→ вставленный объект класса делегата приложения с выходом окна, подключенным к окну