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

367

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

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

Ниже мой метод 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.

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

  • 5
    Сделайте NSLog для self.tabBarController прямо перед выполнением задания. Сообщение выдается только в том случае, если контроллер равен нулю. Если это ноль, и вы убедились, что ваши соединения правильные, попробуйте создать экземпляр контроллера в коде.
  • 0
    я только что почистил и перестроил
Показать ещё 1 комментарий
Теги:

49 ответов

192
Лучший ответ

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

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
  • 0
    Woot, это сработало! Спасибо!
  • 0
    Ак, неважно, это не сработало :( Перезапустил симулятор iOS и bam, та же проблема.
Показать ещё 8 комментариев
397

Заменить в AppDelegate

 [window addSubview:[someController view]];

к

  [self.window setRootViewController:someController];
  • 0
    Это избавилось от сообщения для меня. Это все еще не показывает последующее окно, но это может быть другой проблемой. Благодарю.
  • 3
    Если вы используете UINavigationController, вы должны сначала [[UINavigationController] initWithRootViewController: tableViewController], а затем использовать приведенный выше код [self.window setRootViewController: self.navigationController], чтобы установить корневой контроллер окна просмотра
Показать ещё 5 комментариев
66

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

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

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

- (void)viewDidLoad

к

- (void)viewDidAppear:(BOOL)animated

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

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

Удачи!

  • 1
    Warkst, спасибо за ответ. В моем случае я не могу переместить код из viewDidLoad: (без добавления флага), и при этом я не должен это делать. Независимо, спасибо за предложение!
  • 2
    Нашел это сегодня и рад, что я сделал - та же самая проблема - показывал запуск uialert в viewDidLoad. Поменял на viewDidAppear и работает нормально. Не уверен, что Apple добилась большего, изменив это в iOS5.
Показать ещё 8 комментариев
46

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

Изображение 5431

  • 2
    Это сработало для меня! Это работает, когда вы создаете пустой проект в Xcode 4.2, где не будет никакого MainWindow, и вот как мы должны его подключить.
  • 0
    Проблема для нас возникла, когда мы случайно удалили строку «Основное имя основного файла пера» из файла «Info.plist». Вставка этой строки снова устранила проблему.
Показать ещё 2 комментария
43

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

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

от

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

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

  • 0
    Это исправило это и для меня. Я использовал приложение с вкладками со Storyboard, к которому я пытался добавить CoreData, и столкнулся с этой проблемой.
  • 0
    LOL, если я добавлю это, я получу два предупреждения о том, что окна приложений должны иметь контроллер корневого представления !!
Показать ещё 1 комментарий
26

Я сталкиваюсь с той же проблемой в последнее время при создании проекта с помощью 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.

  • 0
    Это сработало для меня после реализации решения Шо.
  • 0
    Большой! У меня тоже работало
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;
    }
}
  • 0
    Мне любопытно узнать, сколько окон у вашего приложения и есть ли у всех контроллер корневого представления. Спасибо
  • 5
    ПРИМЕЧАНИЕ . Этот ответ является обходным путем и не устраняет основную причину. См. Stackoverflow.com/a/33958144/1116061
Показать ещё 1 комментарий
22

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

Добавить

window.rootViewController = navigationController;

после

[window addSubview:navigationController.view];

в моем appdelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
19
  • Выберите свое "окно" в файле Nib.
  • В "Инспекторе атрибутов" Установите флажок "Видимый при запуске"

Изображение 5432

  • Это происходит, когда ваш файл nib создается вручную.
  • Это исправление работает для обычного режима nib, а не для режима раскадровки.
  • 0
    Я думаю, это только в режиме раскадровки.
  • 0
    Нет, этот проект был в обычном режиме. Это скриншот из режима раскадровки. «Видимый при запуске» против «Является ли контроллер начального вида».
Показать ещё 7 комментариев
16

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

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

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

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

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

  • 0
    Ссылка на статью cupsofcocoa.com мертва - есть идеи, если где-нибудь есть копия?
  • 1
    это переехало на binpress.com, обновил ссылку в ответе
Показать ещё 1 комментарий
11

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

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

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

  • 0
    Это сработало и для меня.
  • 0
    да, это было это - спасибо
Показать ещё 1 комментарий
11

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

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

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

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

  • 0
    Я могу подтвердить, что это может вызвать проблему. У меня была такая же ситуация, следуя руководству по TableView, где они создают набор делегатов в loadView. После перемещения этого кода в viewDidLoad и удаления loadView все стало работать по мере необходимости.
  • 0
    Вы все еще можете использовать представление загрузки, но добавить [super loadView]; в начале.
Показать ещё 2 комментария
11

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

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

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

  • 0
    много похвал, это то, что я хотел (пустой проект с раскадровкой)
  • 2
    Тоже самое. Благодарю. Если вы создаете пустое приложение, этот метод заполняется ручным созданием окна. Это должно быть изменено, чтобы просто вернуть ДА. Спасибо
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

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

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

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

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

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

  • 0
    это сработало для меня.
  • 0
    БЛАГОДАРЮ. это работает и для меня.
9

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

self.window.rootViewController = self.tabBarController;

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

  • 0
    Нет, это не сработало. Спасибо за вашу помощь!
8

Я столкнулся с той же проблемой, но использовал 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;
}

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

8

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

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

Изображение 5433

  • 1
    +1, большое спасибо .... У меня та же проблема и может быть решена только вашим ответом .. Спасибо :)
7

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

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

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

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

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

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

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

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

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
  • 0
    Это также избавило меня от ошибки. Но почему?
  • 1
    Я не помню ...
6

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

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

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

  • 0
    Вы уверены, что? Вы проверяли это?
  • 0
    Я уверен, что это создает окно, и я уверен, что это не создает проблемы в моих приложениях.
Показать ещё 2 комментария
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. Подключите все это в редакторе интерфейса

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

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

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

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

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

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

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

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

6

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

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

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

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

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

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

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

В верхней части ответа "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.

4

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

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

4

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

[self.window makeKeyAndVisible];

от

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

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

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

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

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

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

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

2

Я получал эту ошибку (Applications are expected to have a root view controller at the end of application launch), и я программным образом создавал контроллеры представлений.

Решил его, гарантируя, что метод loadView в моем контроллере корневого представления вызывал [super loadView].

  • 0
    Согласно документации iOS 6.1 для loadView, «ваша пользовательская реализация этого метода не должна вызывать super». Я думаю, что предпочтительным вариантом действий является self.view = [[UIView new] autorelease]; ,
1

Если ваше приложение заменяет основной UIWindow FingerTipWindow (чтобы показать штрихи на проекторе), и вы не обновили свои источники в течение нескольких (нескольких) лет, ваш объект замены может не включать свойство rootViewController (см. kgn 5/21/2013 mod at GitHub)

Вы можете установить window.rootViewController в didFinishLaunchingWithOptions, пока корова не вернется домой, но ваше окно не сообщит об этом "в конце запуска приложения" и выкинет исключение во время выполнения. Обновите источники.

1

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

-(BOOL) application:(UIApplication*) application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
{
    ...
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        ...
        dispatch_async(dispatch_get_main_queue(), ^{
            ...
            [self updateTabBarTitles];
            self.window.rootViewController = self.tabBarController;
            ...
        });
    });

    [self.window makeKeyAndVisible];
    return YES;
}

Переместив назначение rootViewController в конец функции - перед вызовом makeKeyAndVisible: - заставляет сообщение журнала больше не отображаться.

{
    ...
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

Надеюсь, это поможет.

1

Я столкнулся с этим в iPad-приложении, ориентированном на iOS 5.1 в Xcode 4.5.1. Приложение использует UITabBarController. Мне нужен новый раздел в контроллере панели вкладок, поэтому я создал новый контроллер представления и xib. Как только я добавил новый контроллер представления в контроллер панели вкладок, ни один из моих экранных элементов управления больше не работал, и я получил журнал ожиданий с журналом контроллера корневого каталога.

Как-то объект верхнего уровня в новом xib был UIWindow вместо UIView. Когда я сбросил UIView в XIB, у него была точка вывода точки обзора, переместила все подзоны в новый UIView и удалила экземпляр UIWindow, проблема была исправлена.

1

Хотя многие из этих ответов кажутся действительными, ни один из них не зафиксировал сообщение для меня. Я экспериментировал с пустым шаблоном приложения и пытался загрузить прямо в файл .xib для понимания (например, для шаблона старого окна). Кажется, что Apple оставила сообщение NSLog.

Я был на Xcode 4.3, и ничто, казалось, не избавилось от сообщения, и я хотел знать, почему. Наконец, я решил посмотреть, что произойдет в Xcode 4.5 (предварительный просмотр/сборка iPhone 6.0), и сообщение больше не существует. Двигаемся дальше.

1

Эта ошибка поразила меня внезапно. Итак, что вызвало это?

Оказывается, я был в IB, прикреплял File Owner к новому маленькому ImageView, который я бы перетащил в View. Я не назвал его IBOutlet в файле .h, поэтому, когда я перетащил ctrl-мышью, новый образ не был указан как возможное соединение. Единственной возможностью, отображаемой в маленьком черном ящике, была View. Я должен был случайно щелкнуть. Я сделал несколько изменений, затем запустил программу и получил ошибку корневого контроллера. Исправление связано с повторным подключением владельца файла к нижнему виду на экране xib-IB.

1

Убедитесь, что ваш "Начальный контроллер просмотра" установлен правильно для вашей первой сцены. Изображение 5434

Что вызывает ошибку.

  • 0
    Кажется, у меня нигде нет такой возможности. Я вижу точно такой же экран, без опции Initial Scene .
  • 0
    убедитесь, что вы выбрали вид контроллера. Вы можете нажать на верхней панели, где отображается батарея. если вы выбрали правильно, весь контроллер вида будет иметь синий ореол вокруг него.
Показать ещё 3 комментария
1

Звучит как self.tabBarController возвращает nil. tabBarController, вероятно, не подключен в Interface Builder. Установите IBOutlet of tabBarController в tabBarController в построителе интерфейсов.

  • 0
    Нет, это не сработало. Спасибо за вашу помощь!
0

Это решение Swift 2 работало для меня:

Вставьте код ниже в AppDelegate → didFinishLaunchingWithOptions

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass
0

Перемещение setRootViewController: от didFinishLaunchingWithOptions: до awakeFromNib: разрешило это в моем пустом проекте.

  • 2
    awakeFromNib чего именно? : /
0

В моем случае все о фактическом окне и методе didFinishLaunchingWithOptions: было в порядке.

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

Поэтому в applicationDidBecomeActive: я манипулировал контроллерами представлений, которые еще не закончили все их настройки (ожидая ответа на разные потоки и т.д.).

Как только я переместил эту функцию за пределы applicationDidBecomeActive, ошибки исчезли.

0

Ни один из ответов не устранил мою проблему.

Я работаю над старым проектом iOS4, обновленным до ARC, и теперь он работает в Xcode 5 для iOS 7

Я прочитал все их и начал проверять мою конфигурацию и код.

Для меня было установлено

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

В дополнение к наличию

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

У меня не было

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

до получения ошибки.

0

Ни один из вышеперечисленных не работал у меня... обнаружил что-то не так с моим методом init на моем приложении appDelegate. Если вы реализуете метод init, убедитесь, что вы сделали это правильно

У меня было это:

- (id)init {
    if (!self) {
        self = [super init];
        sharedInstance = self;
    }
    return sharedInstance;
}

и изменил его на следующее:

- (id)init {
    if (!self) {
        self = [super init];
    }
    sharedInstance = self;
    return sharedInstance;
}

где "sharedInstance" - это указатель на мой appDelegate singleton

0

Я перенесла старый образец образца EAGLView в новый образец образца GLKView в Xcode 4, и ни один из решений не работал у меня. Наконец, я понял, что пытался установить основной GLKViewController self.view, чтобы указать на вложенный GLKView в Interface Builder.

Когда я указал self.view обратно в корень GLKView в Interface Builder, мое приложение затем могло запускаться без сообщения об ошибке (поэтому убедитесь, что вид вашего контроллера представления установлен в корневом представлении).

P.S. если вы хотите, чтобы вложенный GLKView работал, создайте новую переменную-член, например self.glkSubview в ViewController.h, и перетащите ее соединение с вложенным GLKView в Interface Builder. Затем обязательно перетащите делегат self.glkSubview в File Owner. Вы должны вручную вызвать [self.glkSubview display] в "- (void) glkView: (GLKView *) view drawInRect: (CGRect) rect", если у вас установлено значениеNeedsDisplay для GLKView.

0

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

- (void)applicationDidBecomeActive:(UIApplication *)application 

вместо

- (void)applicationWillEnterForeground:(UIApplication *)application
0

для изменения ARC:

измените на

@synthesize window;

вместо

@synthesize window=_window;
0

Вы пытались установить делегат, т.е.

self.rootController.delegate = self;

внутри applicationDidFinishLaunchingWithOptions? Это сработало для меня, хотя я не уверен, почему.

0

У меня также была эта проблема. Оказывается, когда я удалил делегата приложения из списка объектов слева, я удалил соединение для App Delegate, Window и TabBarController:)

-6

Подтвердите свой файл STORYBOARD... Если вы используете IB для "подключения" кода к вашему пользовательскому интерфейсу.. и просто удалите элемент пользовательского интерфейса... и затем поймите, о, вам нужно удалить ссылку в коде (в моем случае UIButton называется AbortButton)... затем через несколько секунд приложение не запустится...

Проблема находится в файле "раскадровки". Откройте его в редакторе xml и посмотрите на сиротские "отношения", разъемы, которые указывают места, где они не должны...

например:

< отношения >   < отношение вид = "выход" name= "AbortButton" кандидатclass= "UIButton" / >

больше не существовало в моем коде... (но у меня все еще был "соединитель", связанный в файле раскадровки).

Также у меня был (как-то и недействительный коннектор из UIImageView или ToolBar на мой основной объект UIViewController.view)... не думаю, что ему понравилось, что...

нижняя строка - не нужно вручную вводить код контроллера обратно... файл STORYBOARD взломан. Я исправил мой, и бинго снова отлично поработало.

и BTW, как текстовый кодировщик. Я очень люблю IB... пинает над MS Visual Studio IDE...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню