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

383

Я получаю следующую ошибку в моей консоли:

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

Ниже мой 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's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

В Интерфейсном Разработчике UITabBarControllerделегат подключен к Делегату приложения.

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

АртСабинцев
источник
5
Сделайте NSLog для self.tabBarController прямо перед выполнением задания. Сообщение выдается только в том случае, если контроллер равен нулю. Если это ноль, и вы убедились, что ваши соединения правильные, попробуйте создать экземпляр контроллера в коде.
FeifanZ
попробуйте прокомментировать инициализацию окна .. проверьте этот ответ stackoverflow.com/a/33958144/1293445
mohammad alabid

Ответы:

188

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

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
шо
источник
49
Другой вариант - убедиться, что класс делегата приложения импортирован в main и используется NSStringFromClass. Вот как Xcode теперь создает файл main.m. Например: #import "AppDelegate.hа потомint retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
шо
10
убедитесь, что self.windowинициализирован какself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor
1
Я попробовал вышеупомянутые варианты, не работал для меня. И я не использую раскадровку.
Джоуи
3
Для меня это никак не повлияло, то же самое сообщение «Приложения ожидаются ...» после внесения изменений. Решением был ответ OrdoDei (см. Выше или ниже), который работал отлично.
Андрей
1
Если вы видите белый вид в симуляторе, но ожидаете увидеть макет из раскадровки, убедитесь, что вы избавились от кода в корневой функции делегата «application didFinishLaunchingWithOptions ...», на которую указывает main.m, и имеют только «return» ДА;" в этом.
Оливье де Йонге
435

Заменить в AppDelegate

 [window addSubview:[someController view]];

в

  [self.window setRootViewController:someController];
OrdoDei
источник
Это избавилось от сообщения для меня. Это все еще не показывает последующее окно, но это может быть другой проблемой. Спасибо.
Jazzmine
3
Если вы используете UINavigationController, вы должны сначала [[UINavigationController] initWithRootViewController: tableViewController], а затем использовать приведенный выше код [self.window setRootViewController: self.navigationController], чтобы установить контроллер корневого представления окна
emdog4
У Cocos2d есть комментарий, который говорит: «// AddSubView не работает на iOS6», так что это исправило это для меня, так как я использую iOS 6.
Almo
1
addSubviewЛиния была частью шаблона проекта на ранней версии Xcode / IOS SDK. Если приложение вернулось в прошлое, оно может быть у вас, даже если вы его не написали.
Сева Алексеев
привет, я получаю эту ошибку: - *** Ошибка подтверждения в - [UIApplication _runWithMainScene: transitionContext: завершение:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294 как это решить
Акаш Рагани
70

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

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

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

- (void)viewDidLoad

в

- (void)viewDidAppear:(BOOL)animated

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

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

Удачи!

Warkst
источник
1
Warkst, спасибо за ответ. В моем случае я не могу удалить код viewDidLoad:(без добавления флага), и я не должен этого делать. Независимо, спасибо за предложение!
АртСабинцев
2
Нашел это сегодня и рад, что я сделал - та же самая проблема - показывал запуск uialert в viewDidLoad. Поменял на viewDidAppear и работает нормально. Не уверен, что Apple добилась большего, изменив это в iOS5.
GuybrushThreepwood
Спасибо за предположение, что это было вызвано просмотром предупреждений, та же проблема случилась и со мной.
Крис
1
Не могли бы вы сказать нам, какой код вы должны были удалить, чтобы разобраться? Я использую свой viewDidLoadдля многих вещей, настраивая все новички, такие как добавление данных в UITableView. Я не могу переместить это, viewDidAppear:потому что я только хочу, чтобы это выстрелило один раз.
Джоуи
1
Проблема была не в том, что функция. Проблема заключалась в том, что вы забыли вызвать [super viewDidLoad] в вашей функции viewDidLoad, эффективно убивая нагрузку на кончик. То же самое случилось со мной не раз.
Borrrden
47

Я получил это, когда начал с шаблона «Пустое приложение», а затем вручную добавил XIB. Я решил это, установив основное имя пера, как предложено Санни. Недостающим шагом в этом сценарии является удаление

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

от

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

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

оборота
источник
Это исправило это и для меня. Я использовал приложение с вкладками со Storyboard, к которому я пытался добавить CoreData, и столкнулся с этой проблемой.
Гитаарик
LOL, если я добавлю это, я получу два предупреждения о том, что окна приложений должны иметь контроллер корневого представления !!
Джордж Асда
46

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

введите описание изображения здесь

Солнечный
источник
2
Это сработало для меня! Это работает, когда вы создаете пустой проект в Xcode 4.2, где не будет никакого MainWindow, и вот как мы должны его подключить.
Джевангс
Проблема для нас возникла, когда мы случайно удалили строку «Основное имя основного файла пера» из файла «Info.plist». Вставка этой строки снова устранила проблему.
rtovars
Вы также можете установить это в свойствах проекта. Выберите проект, свою цель, вы можете отредактировать это в Сводке -> Информация о развертывании iPhone / iPad.
doekman
на самом деле это была проблема для меня, что привело к множеству проблем, связанных с вызовом viewDidLoad и viewWillAppear дважды для rootViewController. В моем случае устранение этого было решением
Whyoz
27

Я столкнулся с той же проблемой недавно, когда строю проект с ios5 sdk. Сначала он собирался и работал правильно, но после этого появилась ошибка.
В моем случае решение было довольно простым.
Чего не хватало, так это того, что свойство Main Interface на вкладке сводки цели моего приложения было стерто. Поэтому мне нужно было установить его снова.


Если это не главное, и если 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.

denicija
источник
24

Я обновился до 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;
    }
}
Майк Флинн
источник
Мне любопытно узнать, сколько окон у вашего приложения и есть ли у всех контроллер корневого представления. Спасибо
DrAL3X
5
ПРИМЕЧАНИЕ . Этот ответ является обходным путем и не устраняет основную причину. См stackoverflow.com/a/33958144/1116061
Липка
Вы настоящий герой!
user2161301
21

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

Добавить:

window.rootViewController = navigationController;

после:

[window addSubview:navigationController.view];

в моем приложении

- (void)applicationDidFinishLaunching:(UIApplication *)application {
RyeMAC3
источник
20
  • Выберите «Окно» в вашем Nib-файле
  • В «Инспекторе атрибутов» отметьте «Видимо при запуске»

образ![]

  • Это происходит, когда ваш файл пера создается вручную.
  • Это исправление работает в обычном режиме пера, а не в режиме раскадровки.
оборота медведь
источник
Я думаю, это только в режиме раскадровки.
АртСабинцев
Нет, этот проект был в обычном режиме. Это скриншот из режима раскадровки. «Видимый при запуске» против «Является ли контроллер начального вида».
BearMountain
3
Если файл пера окна, созданный вручную, и «видимый при запуске» по умолчанию не отмечен, предложит это сообщение после запуска приложения, это решит мою проблему!
ZYiOS
О, СПАСИБО!!! Наконец, решение этого раздражающего предупреждения. Даже если у вас есть, makeKeyAndVisibleэто не решает проблему. ТОЛЬКО это решило предупреждение для меня. БЛАГОДАРЮ ВАС!
tacos_tacos_tacos
«Это происходит в обычном режиме пера, а не в режиме раскадровки». Не очень верно. Я сталкиваюсь с той же самой проблемой Storyboardтакже
thesummersign
19

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

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

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

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

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

Реми
источник
Ссылка на статью cupsofcocoa.com мертва - есть идеи, если где-нибудь есть копия?
Ríomhaire
1
это переехало на binpress.com, обновил ссылку в ответе
rémy
Это отличная ссылка. Хорошо читаю и объясняю, что происходит. Я только что столкнулся с этой проблемой, используя старую книгу (поскольку я сначала хочу изучить Objective-C), но при написании кода на последней версии XCode 7, в которой нет старых шаблонов.
Ибаральф
11

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

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

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

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

trcarden
источник
Я могу подтвердить, что это может вызвать проблему. У меня была такая же ситуация, следуя руководству по TableView, где они создают набор делегатов в loadView. После перемещения этого кода в viewDidLoad и удаления loadView все стало работать по мере необходимости.
Евгений
Вы все еще можете использовать представление загрузки, но добавить [super loadView]; в начале.
Герман Клекер,
1
Хм ... документация для loadView специально гласит, что вы не должны вызывать метод super.
Джошуа Салливан
Я переопределил UIViewController по умолчанию в раскадровке и обнаружил, что в коде шаблона для создания подкласса UIViewController по умолчанию включен loadView, что делает меня ... потраченным впустую больше часа на эту глупую вещь. Спасибо за публикацию этого!
Slycrel
11

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

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

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

Брюс Ли
источник
Код: "self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];" вызвать ошибку, поэтому я просто удалил ее.
Григорий А.
11

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

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

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

антициклоп
источник
много похвал, это то, что я хотел (пустой проект с раскадровкой)
Shtirlic
2
Тоже самое. Спасибо. Если вы создаете пустое приложение, этот метод заполняется созданием окна вручную. Это должно быть изменено, чтобы просто вернуть ДА. Thx
Бен Г
10

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

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

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

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

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

cujino
источник
10

В 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
}

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

оборота бобобо
источник
9

Попробуйте подключить IBOutlet контроллера панели вкладок к корневому представлению в Интерфейсном Разработчике вместо

self.window.rootViewController = self.tabBarController;

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

d.lebedev
источник
8

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

В раскрывающемся меню, связанном с «Основным интерфейсом», выберите другую запись, затем снова выберите «Главное окно» и перестройте.

введите описание изображения здесь

RawMean
источник
8

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

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

В

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

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

thesummersign
источник
7

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

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

Я создал один шаблон представления через XCode и сравнил его с моим кодом, и, наконец, нашел проблему!

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

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

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

Рац
источник
это была именно моя проблема! Я добавил реализацию loadView, но не вызывал super. Сделал некоторые другие изменения кода, не мог вспомнить, какого черта я сделал. Застрял на 2 часа, потому что это изменение казалось безобидным.
LearnCocos2D
6

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

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

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

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

- (void)callPopUp
{
    // call UIAlertView
}
Джейнуэй
источник
Спасибо, это решило мою проблему. Вы должны подождать, чтобы показать предупреждение, пока не загрузится окно. В моем случае я просто сделал [alert executeSelector: @selector (show) withObject: nil afterDelay: 1.0];
Deepwinter
6

У меня такая же проблема. Если вы создаете оконное приложение «с нуля», как я, вам нужно сделать следующее: (обратите внимание, это шаги для 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. Подключите все это в редакторе интерфейса

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

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

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

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

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

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

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

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

Том
источник
6

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

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

Это, кажется, не вызывает проблемы.

Смущенный ворлонец
источник
Вы уверены, что? Вы проверяли это?
Сергей Грищев
Я уверен, что это создает окно, и я уверен, что это не создает проблемы в моих приложениях.
растерянный ворлонец
Вы можете установить фиктивный VC для MTStatusBarOverlay, чтобы исправить это.
Уэсли
Это была именно моя проблема. У меня был подобный вид установки с окном, которое было добавлено для панели уведомлений, и как только я прокомментировал это, ошибка исчезла! Это кажется безвредным в этом случае.
Аарон Зинман
6

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

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
Петур Инги Эгильссон
источник
5

ОрдоДей дал правильный и ценный ответ. Я добавляю этот ответ только для того, чтобы привести пример 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's window. Then get the nav controller's 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's 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;
}
Базилик Бурк
источник
4

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

[self.window makeKeyAndVisible];

от

- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)
nicerobot
источник
4

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

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

RachelD
источник
4

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

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

Проблема была в том, что я забыл заполнить четвертый параметр в основном приложении UIApplication и забыл удалить главное окно из «Основного интерфейса» в «Сводке проекта».

Это вызвало ОГРОМНУЮ проблему: оно вынесло безобидное предупреждение «Ожидается, что приложения…» на устройствах разработки, но когда оно зашло в App Store, оно сломалось на потребительских телефонах, аварийно завершив работу, потому что MainWindow больше не было в комплекте! Мне пришлось запросить ускоренный обзор для исправления.

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

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

EPX
источник
4

Чтобы добавить ответ Майка Флинна, после обновления до 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;
    }
}
Kevin_TA
источник
Мне любопытно узнать, сколько окон у вашего приложения и есть ли у всех контроллер корневого представления. Спасибо
DrAL3X
3

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

Убедитесь, что окно вашего делегата приложения и выходы viewController подключены:

В вашем MainWindow.xib удерживайте элемент управления, щелкните «Делегировать приложение» и перетащите его на объект «Окно». Выберите окно. Удерживая кнопку управления, снова выберите делегат приложения, перетащите его в корневой контроллер представления и выберите viewController.

uranazo
источник
3

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

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

JakubKnejzlik
источник
Я создал XIB-файл вручную и начал получать эту ошибку. огромное спасибо!
RawMean