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


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];

Это избавилось от сообщения для меня. Это все еще не показывает последующее окно, но это может быть другой проблемой. Спасибо.
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.

Удачи!


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.


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 {

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, что я обычно использую, я не уловил его.

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


Я могу подтвердить, что это может вызвать проблему. У меня была такая же ситуация, следуя руководству по 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
{
}

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


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;

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


8

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

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

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


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

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


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*)

4

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

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


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.


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

Мне любопытно узнать, сколько окон у вашего приложения и есть ли у всех контроллер корневого представления. Спасибо
DrAL3X

3

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

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

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


3

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

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


Я создал XIB-файл вручную и начал получать эту ошибку. огромное спасибо!
RawMean
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.